我是Picolisp的新手。
我试过这个,并获得了一个段错误:
: ('(1 2) 6)
Segmentation fault
但是,如果我尝试:
: ('(a b c) 6)
-> NIL
我大多理解为什么,但PicoLisp用段错误而不是错误回应是一个惊喜。这是否意味着Picolisp不检查数字是否是一个函数,但它是否为符号?
答案 0 :(得分:3)
是的,这是预期的行为。
PicoLisp可能会重复评估列表的CAR,直到它命中 一个功能。函数是一个列表(然后它是一个Lisp级别 函数)或短数字(然后它是一个内置函数,写入 asm或C)。如果该数字不指向可执行代码 (在运行时很难检查),发生了崩溃。
我会认为这样的崩溃是“扩展错误消息”:为什么不让 硬件(MMU)进行运行时检查?
一般情况下,解释器无法捕获任何内容 可能的错误(例如,想想无限循环),所以PicoLisp需要 对程序员负责的立场。
实际上,首先会检测到与上述错误类似的错误 测试你的程序。
BTW,上述规则的一个例外只是一个直接有一个列表 CAR中的号码。这样的列表会自动评估: : (1 2 3)
-> (1 2 3)
只是一个方便的功能,不必引用这样的常量列表。
: ('(a b c) 6)
-> NIL
我大多理解为什么,但它是一个 Picolisp回应的惊喜 一个段错误而不是错误。是否 这意味着Picolisp不会检查 如果一个数字是一个函数,但确实如此 当它是一个符号?
在这种情况下,(a b c)实际上是一个合法的函数定义:它是一个 具有单个符号参数'a'的函数(因此函数不会 评估它的论点)和两个符号的主体。这是等效的 到
: (de foo a
b
c )
-> foo
执行此函数时,它会将参数列表(3)绑定到该函数 符号'a',然后执行'b'和'c'。此函数返回值 'c',在你的例子中是NIL。
当你这样做时:
: (de foo H H) : (foo 1 2 3) -> (1 2 3) : foo -> (H H)
所以你也可以这样做:
: ('(H H) 1 2 3) -> (1 2 3)
正确。
我打赌你知道这里发生了什么;您 正在尝试使用数字作为 变量,这是非法的 - >紧急 (除了它没有意义 反正)
你所说的是对的。翻译在这个地方点击'1' 期望的函数参数。
: (setq 7 5)
!? (setq 7 5)
7 -- Variable expected
?