代码之家  ›  专栏  ›  技术社区  ›  1MinLeft

(a(b.c)d)在方框符号中的正确表示是什么?

  •  1
  • 1MinLeft  · 技术社区  · 6 年前

    . 我有一把其他人练习的钥匙,那就是:

    http://www.shido.info/lisp/pacl2_e.html

    在做完一周的练习之后 ,我参考那把钥匙逐一核对我的答案。当它成为 (a (b . c) d)

    http://www.shido.info/lisp/acl3-1d75.png

    让我困惑的是,他的回答中 d nil

    那么他的答案正确吗?正确的表达是什么 (a(b.c)d)

    2 回复  |  直到 6 年前
        1
  •  7
  •   Renzo    6 年前

    你可以使用 sdraw program :

    (load "sdraw.generic.lisp")
    
    (sdraw '(a (b . c) d))
    
    [*|*]--->[*|*]------->[*|*]--->NIL
     |        |            |
     v        v            v
     A       [*|*]--->C    D
              |
              v
              B
    

        2
  •  0
  •   user5920214 user5920214    6 年前

    回答这样的问题的方法是让系统为您回答。不幸的是,正确地做到这一点需要理解CL打印系统是如何工作的,这并不是那么简单(事实上:我已经忘记了如何正确地做到这一点!)。但是你可以编写一个无意识的函数,它可以把东西转换成字符串,并使用对象系统以合适的方式把各种各样的东西转换成字符串。这 用于非conses但包含conses的对象,但仅用于简单目的就足够了:

    (defgeneric thing->string (thing)
      (:method ((thing t))
       ;; any kind of thing we don't know about gets printed like this
       (format nil "~A" thing))
      (:method ((thing cons))
       ;; conses get printed like this
       (format nil "(~A . ~A)" 
               (thing->string (car thing))
               (thing->string (cdr thing)))))
    

    (thing->string ...) 我会回答你的问题。