当前位置:  开发笔记 > 编程语言 > 正文

Lisp/Scheme中的自引用数据结构

如何解决《Lisp/Scheme中的自引用数据结构》经验,为你挑选了3个好方法。

有没有办法在lisp或scheme中构建一个自引用数据结构(比如带有周期的图形)?我之前从未想过它,但是由于缺乏进行破坏性修改的方法,我可以找不到任何简单的方法来制作它.这只是函数式语言的一个重要缺陷,如果是这样,那么像haskell这样的懒函数语言呢?



1> Rainer Joswi..:

在Common Lisp中,您可以修改列表内容,数组内容,CLOS实例的插槽等.

Common Lisp还允许读写循环数据结构.使用

? (setf *print-circle* t)
T

; a list of two symbols: (foo bar)

? (defvar *ex1* (list 'foo 'bar))
*EX1*

; now let the first list element point to the list,
; Common Lisp prints the circular list

? (setf (first *ex1*) *ex1*)
#1=(#1# BAR)

; one can also read such a list

? '#1=(#1# BAR)
#1=(#1# BAR)

; What is the first element? The list itself

? (first '#1=(#1# BAR))
#1=(#1# BAR)
? 

所谓的函数式编程语言不允许副作用.大多数Lisp方言并不纯粹.它们允许副作用,并允许修改数据结构.

有关详细信息,请参阅Lisp介绍书.



2> Adam Rosenfi..:

在Scheme中,你可以使用set!,set-car!set-cdr!(以及以bang('!')结尾的任何其他结果,表示修改):

(let ((x '(1 2 3)))
  (set-car! x x)
  ; x is now the list (x 2 3), with the first element referring to itself
  )



3> Doug Currie..:

Common Lisp支持修改数据结构setf.

您可以通过打结来在Haskell中构建循环数据结构.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有