我想写一个简单的Scheme函数,它将给定的列表转换为它的虚线对符号。List to dotted Pair notation
例如,如果输入的是 -
((1 (2)) 3 ((4)))
什么将对应于它的点对符号和哪些规则应保持在函数写这样的逻辑。
任何这样的指针都将真正感激。
我想写一个简单的Scheme函数,它将给定的列表转换为它的虚线对符号。List to dotted Pair notation
例如,如果输入的是 -
((1 (2)) 3 ((4)))
什么将对应于它的点对符号和哪些规则应保持在函数写这样的逻辑。
任何这样的指针都将真正感激。
@Chris给出了正确的方法。只要确保打印car
和cdr
实际上是递归调用你的程序:
(define (display-dotted sexp)
(cond
((null? sexp) (display "()"))
((pair? sexp) (display "(")
(display-dotted (car sexp))
(display " . ")
(display-dotted (cdr sexp))
(display ")"))
(else (display sexp))))
然后
> (display-dotted '((1 (2)) 3 ((4))))
((1 . ((2 .()) .())) . (3 . (((4 .()) .()) .())))
这里是长形式:
((1 . ((2 .()) .())) . (3 . (((4 .()) .()) .())))
写功能打印长形式是简单的:
"("
或#\(
car
" . "
cdr
")"
或#\)
谢谢,方法是正确的。 – 2014-09-20 21:25:25
如果你实现自己的LISP和需要这样做记得比你是什么实际上要比列表显示更容易,而不是虚线对记号。下面是做这件事:
(define (my-display x)
(let recur ((x x) (list-mode #f))
(cond ((pair? x)
(display (if list-mode " " "("))
(recur (car x) #f)
(recur (cdr x) #t))
((not list-mode) (display x))
((null? x) (display ")"))
(else
(display " . ")
(display x)
(display ")")))))
你看,我们需要保持状态告诉我们,因为它看起来如何取决于cdr
,我们正在处理的列表。你想要的是把所有对同一即使cdr
是()
或pair?
所以它要简单得多:
(define (my-display x)
(let recur ((x x))
(cond ((pair? x)
(display "(")
(recur (car x))
(display " . ")
(recur (cdr x))
(display ")"))
(else (display x)))))
当然是真正实现这可能有更多的逻辑,以显示不同的原子值所以感谢这些实际上只是解决对。在制作自己的Lisp Zozotez时,打印是读取后的第二大功能。
我在#racket频道中简单地看到了你。你应该回来,我一定会打个招呼。 :-) – 2014-09-20 19:51:13
这很有帮助,谢谢 – 2014-09-20 21:25:49