【问题标题】:List Representation of Quoted Expressions in Scheme列出 Scheme 中引用表达式的表示
【发布时间】:2016-07-23 14:05:07
【问题描述】:

在 Scheme 中,我正在运行 (quote (+ 2 3)) returns (+ 2 3)。据我了解,这句话只是告诉 Scheme 不要出于某种目的评估我的表达式。我正在尝试在不使用引号的情况下列出(+ 2 3)。所以我尝试了:
输入:(cons '+' (cons 2 (cons 3 '())))
方案返回:(+ cons 2 (cons 3 (quote ())))
- 我不明白为什么我得到这个返回值。我希望(+ 2 3)
输入:(cons '+' (2,3))
方案返回:(+ 2 3)
- 我不明白这是如何工作的。那么,(cons '+' (2,3))(quote (+ 2 3)) 一样吗?

【问题讨论】:

  • 你的引号太多了。你想要(cons '+ ...),而不是(cons '+' ...)
  • @AlexisKing 哦,我以为我需要 '+' 来表示 + 是一个字符,然后 '() 来指定 NULL 列表
  • @AnonymousGal + 是一个符号。一个字符将写为#\+。当你使用两个单引号时,第一个引用+-symbol,第二个引用下面的列表。

标签: list scheme quote


【解决方案1】:

'expression(quote expression) 相同,它变为 expression 未评估。

当您编写(cons '+ '(cons 2 (cons 3 '()))) 时,您同时引用了+ 和第二个参数(cons 2 (cons 3 '()))' 没有结束标记。

在显示对时,如果您想知道为什么它没有变成 (+ . (cons 2 (cons 3 (quote ())))),Lisp 系统将默认显示带有对尾的对作为列表

实现可以选择如何显示'(quote ())''()。我的节目'() 而你的节目(quote ())。它们表示完全相同,因此除了可视化之外,它们在其他方面并没有真正的不同。

`(1 , 2)(list '1 2) 相同,因为您是 unquoting 2。幸运的是,它是一个数字,它总是对自己进行评估。您可能认为逗号是元素之间的某种分隔,但事实并非如此。这只是为了简化编写一个只有少数元素是可变的大型数据结构。

(define (test e)
  `(a list with ,e representing some wanted structure))

(test 'test) ; ==> (a list with test representing some wanted structure)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多