我目前正在做一个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)))很明显,我不能在这里使用list,到目前为止,我唯一的解决方案是ben to cons name和email,cons phone-number to thus,cons address to isn to my to ben。
有一种方法可以仅使用cons、car、cdr、cond、if、eq、assoc和setf来实现列表过程。
发布于 2013-04-19 10:48:37
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)))但这感觉与任务的精神背道而驰。
发布于 2013-04-20 01:02:12
我已经检查过了,但只想让你知道,最终你会这样做:
(defun create-entry (name email phone-number address)
`((name . ,name)
(email . ,email)
(phone-number . ,phone-number)
(address . ,address)))它使用quasiquote作为方便的语法来创建结构化列表。
https://stackoverflow.com/questions/16096320
复制相似问题