使用有限的过程实现列表(lisp)

时间:2013-04-19 02:37:30

标签: list lisp clisp cons

我目前正在制作一个基本通讯录的clisp作业。但是,对这项任务的警告是我只能使用cons,car,cdr,cond,if,eq,assoc和setf来完成任务......

我很早就决定简单地实现自己的列表并附加程序来简化流程,但这并不是特别好用。坦率地说,我迷失了如何仅使用上述程序生成非虚线列表。

这是我正在尝试做的事情:

(defun create-entry (name email phone-number address)
  (list (cons 'name name)
        (cons 'email email)
        (cons 'phone-number phone-number)
        (cons 'address address)))

显然我不能在这里使用列表,到目前为止,我唯一的解决方案是使用姓名和电子邮件,将电话号码和电子邮件号码联系起来,以及那些不是我正在寻找的内容。< / p>

TL; DR是否有办法仅使用cons,car,cdr,cond,if,eq,assoc和setf来实现列表过程。

2 个答案:

答案 0 :(得分:3)

列表只是一堆cons单元格,一个链接到下一个,nil作为最后一个cdr。因此,您可以像这样实现create-entry函数:

(defun create-entry (name email phone-number address)
  (cons (cons 'name name)
    (cons (cons 'email email)
      (cons (cons 'phone-number phone-number)
        (cons (cons 'address address)
          nil)))))

或者,您可以像这样实现自己的list函数版本:

(defun your-own-list (&rest l) l)

(defun create-entry (name email phone-number address)
  (your-own-list 
    (cons 'name name)
    (cons 'email email)
    (cons 'phone-number phone-number)
    (cons 'address address)))

但这感觉它违背了作业的精神。

答案 1 :(得分:1)

已经检查但是你知道,最终你会这样做:

(defun create-entry (name email phone-number address)
  `((name  . ,name)
    (email . ,email)
    (phone-number . ,phone-number)
    (address . ,address)))

使用quasiquote作为方便的语法来创建结构化列表。