我正在浏览以下文档,以便在Python中实现Lisp解释器:http://norvig.com/lispy.html
在standard_env函数中,已经定义了一个字典,用于将某些符号或变量映射到其相应的函数或值。但是,我无法理解env字典中的以下条目:
env = {}
env.update({
'equal?': op.eq,
'list?': lambda x: isinstance(x,list),
'null?': lambda x: x == [],
'number?': lambda x: isinstance(x, (int, float)),
'procedure?': callable,
'symbol?': lambda x: isinstance(x, str),
})
键末尾的"?"是什么意思?您能否提供一些使用这些条目的示例?
语法上?
只是 Lisp 中标识符中允许的众多字符之一。所以它只是函数名称的一部分。
按照约定,以 ?
结尾的函数名称用于返回布尔值的函数。
具体来说,equal?
检查其两个参数是否相等,null?
检查其参数是否为空列表,所有其他参数都是类型检查,即它们检查其参数是否为给定类型。
您能否提供一些使用这些条目的示例?
返回布尔值的函数最常用于if
或cond
条件,因此您可能会看到类似以下内容作为使用 null?
的函数示例:
(define (sum lst)
(if (null? lst)
0
(+ (first lst) (sum (rest lst)))))
熟悉Lisp,但是看看这些术语的定义,这看起来是用来检查参数是什么的,即"list?"映射到一个测试参数是否是列表的函数,"过程?"测试参数是否是一个过程(或至少是可调用的),"null?"测试空列表(也许这就是在解释器中表示nulls的方式), 等。
在大多数 Lisp 方言中,标识符(实际上是符号名称)可以包含标点符号,如 ?
(或!
或-
)
按照惯例,在Scheme中,谓词名称(返回可测试布尔值的命名函数)的名称以?
结尾(例如list?
),而副作用函数的名称以!
结尾(例如vector-set!
);另请参阅R5RS和SICP。
在Common Lisp中,谓词名称通常以P
结尾(例如 listp
)
这些命名约定只是有用的约定。您可以将函数命名为 foo!bar?x
,即使它不是谓词。