【问题标题】:What does backtick mean in LISP?LISP 中的反引号是什么意思?
【发布时间】:2015-07-20 22:12:36
【问题描述】:

我有这个宏,它重写了定义。如果我删除“`”反引号,它将不起作用。有什么解释?

(defmacro define ((name &rest r) body) 
  `(defun ,name ,r ,body))

【问题讨论】:

    标签: lisp common-lisp backticks


    【解决方案1】:

    单引号后跟值的书面表示 将产生该值:

    示例: '(1 x "foo") 将产生一个打印为(1 x "foo")的值。

    现在假设我不想在列表中出现文字符号x。 我的程序中有一个变量x,我想插入 x 绑定的值。

    标记我想要x 的值而不是符号x, 我在x之前插入一个逗号:

    '(1 ,x "foo")
    

    它不会按原样工作 - 我现在得到一个包含文字逗号和符号 x 的值。问题是quote 不知道逗号约定。

    Backtick 或backquote 知道逗号约定,因此会给出正确的结果:

    > `(1 ,x "foo")
    (1 3 "foo")          ; if the value of x is 3
    

    在此处阅读更多信息:http://www.lispworks.com/documentation/HyperSpec/Body/02_df.htm

    【讨论】:

    • 太好了,我明白了,谢谢。还有一件事。休息前的 & 运算符是做什么的? (&休息)
    • &rest 允许您定义具有可变数量参数的函数。假设您要定义一个 plus 函数,其中 (plus 2 3) 和 (plus 2 3 4) 都有效。这个页面有一个很好的解释:gigamonkeys.com/book/functions.html
    • 我觉得值得注意的是,这个功能叫做quasiquoting或者quasi-quoting。
    【解决方案2】:

    反引号/反引号会禁用每个子表达式的计算,该子表达式前面没有逗号,用于运算符后面的列表。

    来自通用 lisp 食谱,explanation and a few examples。

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2011-04-18
      • 1970-01-01
      相关资源
      最近更新 更多