Common Lisp - 需要帮助获取代码以匹配样本输出

时间:2014-04-25 03:52:33

标签: common-lisp

我有一份学校作业,我想弄明白。我们得到了程序应该生成的示例输出,但我不明白如何重现输出。基本上我们应该使用'insert'函数将列表插入表中。 'insert'的定义如下:

insert(table name value)

以下是一些示例输入/输出:

(setq list1 (insert nil 'name1 'value1))

((NAME1 VALUE1))

(setq list2 (insert nil 'name2 'value2))

((NAME2 VALUE2))

(setq list2 (insert list2 'name3 'value2))

((NAME2 VALUE2) (NAME3 VALUE2))

最后一次setq电话让我感到困惑。包含'name1'和'name2'的列表将'nil'作为表参数。带有'name3'的列表将list2作为表参数,这意味着将其插入到包含'name2'的列表的同一个表中,但是如何编写该函数来执行此操作? Lisp有没有办法从setq中提取符号名称?

1 个答案:

答案 0 :(得分:0)

setq只是将变量设置为函数insert返回的值。

此功能的结果是

1)包含列表的列表(如果第一个参数是nil

? (list (list 'name1 'value1))
((NAME1 VALUE1))

2)或包含列表的列表追加到表达式(如果第一个参数不是nil):

? list2
((NAME2 VALUE2))
? (append list2 (list (list 'name3 'value3)))
((NAME2 VALUE2) (NAME3 VALUE3))

所以函数可以表示为

(defun insert (source name value)
  (if source
    (append source (list (list name value))) ; then branch (source is not nil)
    (list (list name value))))               ; else branch (source is nil)

但由于(list ...)(append nil (list ...))

相同
? (list (list 'a 'b))
((A B))
? (append nil (list (list 'a 'b)))
((A B))

你也可以说

(defun insert (source name value)
    (append source (list (list name value))))