2014-09-20 60 views
0

我想写一个简单的Scheme函数,它将给定的列表转换为它的虚线对符号。List to dotted Pair notation

例如,如果输入的是 -

((1 (2)) 3 ((4))) 

什么将对应于它的点对符号和哪些规则应保持在函数写这样的逻辑。

任何这样的指针都将真正感激。

回答

1

@Chris给出了正确的方法。只要确保打印carcdr实际上是递归调用你的程序:

(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

我在#racket频道中简单地看到了你。你应该回来,我一定会打个招呼。 :-) – 2014-09-20 19:51:13

+2

这很有帮助,谢谢 – 2014-09-20 21:25:49

1

这里是长形式:

((1 . ((2 .()) .())) . (3 . (((4 .()) .()) .()))) 

写功能打印长形式是简单的:

  1. 如果输入的是一对,打印以下:
    1. "("#\(
    2. 该对car
    3. " . "
    4. 一对中的cdr
    5. ")"#\)
  2. 否则,打印的项目原样。
+0

谢谢,方法是正确的。 – 2014-09-20 21:25:25

0

如果你实现自己的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时,打印是读取后的第二大功能。