2

我目前正在制作一个基本地址簿的 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)))

显然我不能在这里使用列表,到目前为止,我唯一的解决方案是使用姓名和电子邮件,使用电话号码和使用地址,这并不是我想要的。

TL;DR 有没有办法只使用 cons、car、cdr、cond、if、eq、assoc 和 setf 来实现列表过程。

4

2 回答 2

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)))

但这感觉与任务的精神背道而驰。

于 2013-04-19T02:48:36.697 回答
1

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

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

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

于 2013-04-19T17:02:11.720 回答