【问题标题】:What does 'null?', 'procedure?' and 'symbol?' mean in the following code?'null?'、'procedure?' 是什么意思?和“符号?”在下面的代码中是什么意思?
【发布时间】:2018-12-26 10:50:06
【问题描述】:

我正在阅读以下文档以在 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),
})

'?' 是什么意思?底键是什么意思?您能否提供一些使用这些条目的示例?

【问题讨论】:

    标签: python lisp


    【解决方案1】:

    从语法上讲,? 只是 Lisp 标识符中允许的众多字符之一。所以它只是函数名的一部分。

    按照惯例,以? 结尾的函数名称用于返回布尔值的函数。

    特别是equal? 检查它的两个参数是否相等,null? 检查它的参数是否是一个空列表,而所有其他的都是类型检查,即它们检查它们的参数是否是给定的类型。

    您能否提供一些将使用这些条目的示例?

    返回布尔值的函数最常用于ifcond 条件中,因此您可能会看到类似这样的函数使用null? 的示例:

    (define (sum lst)
      (if (null? lst)
        0
        (+ (first lst) (sum (rest lst)))))
    

    【讨论】:

      【解决方案2】:

      我不熟悉 Lisp,但看看这些术语的定义,这看起来像是用来检查参数是什么,即“列表?”映射到一个测试参数是否为列表的函数,“过程?”测试参数是否是一个过程(或至少是可调用的),'null?'测试一个空列表(也许这就是空值在解释器中的表示方式)等等。

      【讨论】:

        【解决方案3】:

        在大多数 Lisp 方言中,标识符(实际上是 symbol 名称)可以包含像 ?(或 !-)这样的标点符号

        通常,在 Scheme 中,谓词 名称(命名函数返回可测试的布尔值)的名称以 ? 结尾(例如 list?),副作用函数的名称以!(例如vector-set!);另见R5RSSICP

        在 Common Lisp 中,predicate 名称通常以 P 结尾(例如 listp

        这些命名约定只是有用的约定。你可以将你的函数命名为foo!bar?x,即使它不是谓词。

        【讨论】:

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