我有一份学校作业,我想弄明白。我们得到了程序应该生成的示例输出,但我不明白如何重现输出。基本上我们应该使用'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中提取符号名称?
答案 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))))