[英]List to dotted pair notation
我正在嘗試編寫一個簡單的Scheme函數,將給定列表轉換為其點對表示法。
例如,如果輸入是-
((1 (2)) 3 ((4)))
什么將與其虛線對表示法相對應,以及應在函數中保留哪些規則以編寫此類邏輯。
任何此類指針將不勝感激。
這是長格式:
((1 . ((2 . ()) . ())) . (3 . (((4 . ()) . ()) . ())))
編寫函數以打印長格式很簡單:
"("
或#\\(
car
" . "
cdr
")"
或#\\)
@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 . ()) . ()) . ())))
如果您曾經實現自己的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?
也要對所有對都相同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印刷品是閱讀后的第二大功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.