我一直在google和drRacket上四处搜寻,试图了解程序中的撇号'
在球拍中的含义以及如何将其删除。我想做的是从列表'(+ 1 2)
中获取一个+。但是,每次我执行类似(first x)
(其中x是示例中的列表)的操作时,我都会收到'+而不是+(注意撇号)。如何删除撇号及其目的是什么?
答案 0 :(得分:3)
'
撇号,发音为quote
,表示其中的内容将被解释为s表达式的数据,而不是代码。
'x
,'hello
和'+
都是符号,就像具有唯一标识属性的字符串一样。它们仅包含文本,而不包含“含义”,因此'+
符号不包含对+
函数的引用。
如果在'
引号下使用括号,它将创建一个列表,其中所有元素也都用'
引号。换句话说,'(x y z)
等效于(list 'x 'y 'z)
。您可以认为这是对其中所有元素的“自我分配”。
在您的情况下,'(+ 1 2)
等同于(list '+ '1 '2)
,与(list '+ 1 2)
相同,因为数字已经是文字数据。
在大多数情况下,摆脱'
引用的最佳方法是首先不要在外部添加引号。可以使用'(+ 1 2)
:list
代替(list + 1 2)
,或者使用更高级的形式`
准引用和,
取消引用:`(,+ 1 2)
。在这两种情况下,+
都不会放在引号中。它永远不会像'+
这样的符号。任何引号外的+
都具有加法功能。
在其他情况下,您无法避免使用符号'+
,因为它来自内在的文本数据。在这种情况下,您可以使用解释器为其分配含义。在该解释器的某个位置,您可能需要这样的代码
(match sym ['+ +] ['- -] ['* *] ['/ /] [_ (error "unrecognized symbol")])
需要一些东西来在外部分配 的含义,因为符号'+
在内部没有这种含义。您可以自己定义解释程序,也可以使用现有的诸如eval 的解释程序,只要解释程序中的所有含义与您的意图完全一致。