我目前正在做一个清晰的任务,制作一个基本的地址簿。然而,这个作业的警告是,我只能使用cons, car, cdr, cond, if, eq, assoc和set来完成作业…
我一开始就决定简单地实现我自己的列表并附加程序来简化过程,但这并不是特别有效。坦率地说,我不知道如何仅使用上述过程生成一个无点列表。
我要做的是:
(defun create-entry (name email phone-number address)
(list (cons 'name name)
(cons 'email email)
(cons 'phone-number phone-number)
(cons 'address address)))
显然我不能在这里使用列表,到目前为止,我唯一的解决方案是把姓名和电子邮件,把电话号码和地址对应起来,这不是我想要的。
是否有办法只使用cons、car、cdr、cond、if、eq、assoc和setf来实现list过程?列表只是一堆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)))
但那感觉好像违背了作业的精神。
已经检查过了,但你知道,最终你会这样做:
(defun create-entry (name email phone-number address)
`((name . ,name)
(email . ,email)
(phone-number . ,phone-number)
(address . ,address)))
使用quasiquote
作为方便的语法来创建结构化列表。