我目前正在制作一个基本通讯录的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来实现列表过程。
答案 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
作为方便的语法来创建结构化列表。