用有限的过程实现list (lisp)



我目前正在做一个清晰的任务,制作一个基本的地址簿。然而,这个作业的警告是,我只能使用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作为方便的语法来创建结构化列表。

相关内容

  • 没有找到相关文章

最新更新