球拍中的“ +”代表什么?

时间:2019-09-25 00:06:33

标签: syntax racket

我一直在google和drRacket上四处搜寻,试图了解程序中的撇号'在球拍中的含义以及如何将其删除。我想做的是从列表'(+ 1 2)中获取一个+。但是,每次我执行类似(first x)(其中x是示例中的列表)的操作时,我都会收到'+而不是+(注意撇号)。如何删除撇号及其目的是什么?

1 个答案:

答案 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 的解释程序,只要解释程序中的所有含义与您的意图完全一致。