Picolisp问题,操纵数字列表时的段错误(来自邮件列表)

时间:2009-11-11 06:18:53

标签: lisp picolisp

我是Picolisp的新手。

我试过这个,并获得了一个段错误:

: ('(1 2) 6)
Segmentation fault

但是,如果我尝试:

: ('(a b c) 6)
-> NIL

我大多理解为什么,但PicoLisp用段错误而不是错误回应是一个惊喜。这是否意味着Picolisp不检查数字是否是一个函数,但它是否为符号?

1 个答案:

答案 0 :(得分:3)

(取自picolisp mailing list。)

是的,这是预期的行为。

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
   ?