簡體   English   中英

列表到點對符號

[英]List to dotted pair notation

我正在嘗試編寫一個簡單的Scheme函數,將給定列表轉換為其點對表示法。

例如,如果輸入是-

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

什么將與其虛線對表示法相對應,以及應在函數中保留哪些規則以編寫此類邏輯。

任何此類指針將不勝感激。

這是長格式:

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

編寫函數以打印長格式很簡單:

  1. 如果輸入是一對,則打印以下內容:
    1. "("#\\(
    2. car
    3. " . "
    4. 對的cdr
    5. ")"#\\)
  2. 否則,按原樣打印項目。

@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 . ()) . ()) . ())))

如果您曾經實現自己的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM