【问题标题】:Common Lisp - Need help getting code to match sample outputCommon Lisp - 需要帮助获取代码以匹配示例输出
【发布时间】:2014-06-10 14:55:35
【问题描述】:

我有一个学校作业要弄清楚。我们得到了程序应该产生的示例输出,但我不明白如何重现输出。基本上我们应该使用“插入”函数将列表插入到表中。 '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 或其他东西中提取符号名称?

【问题讨论】:

    标签: common-lisp


    【解决方案1】:

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

    【讨论】:

    • 我现在明白了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多