Picolisp问题,处理数字列表时出现SEGFULT(来自邮件列表)

Picolisp问题,处理数字列表时出现SEGFULT(来自邮件列表),lisp,picolisp,Lisp,Picolisp,我是皮科利普的新手 我试了一下,得到了一个错误: : ('(1 2) 6) Segmentation fault 但是,如果我尝试: : ('(a b c) 6) -> NIL 我基本上理解了原因,但令人惊讶的是PicoLisp的响应是SEGFULT而不是错误。这是否意味着Picolisp不会检查一个数字是否是函数,但当它是一个符号时会检查?(从中提取) 是的,这是预期的行为 PicoLisp对列表中的汽车进行评估,可能会重复评估,直到它击中目标 在一个函数上。函数可以是列表(然后是L

我是皮科利普的新手

我试了一下,得到了一个错误:

: ('(1 2) 6)
Segmentation fault
但是,如果我尝试:

: ('(a b c) 6)
-> NIL
我基本上理解了原因,但令人惊讶的是PicoLisp的响应是SEGFULT而不是错误。这是否意味着Picolisp不会检查一个数字是否是函数,但当它是一个符号时会检查?

(从中提取)

是的,这是预期的行为

PicoLisp对列表中的汽车进行评估,可能会重复评估,直到它击中目标 在一个函数上。函数可以是列表(然后是Lisp级别) 函数)或一个短数字(那么它是一个内置函数,用 asm或C)。如果该数字不指向可执行代码 (在运行时很难检查),会发生崩溃

我会考虑这样的崩溃:“扩展错误信息”:为什么不让 硬件(MMU)是否执行运行时检查

一般来说,解释器不可能捕捉到任何信息 可能的错误(例如,考虑无限循环),因此PicoLisp 给程序员一些责任的立场

在实践中,类似上述错误将在第一时间检测到 程序的测试运行

顺便说一句,上述规则的一个例外是,只有一个列表直接具有 车里的号码。这样的列表会自动评估:

   : (1 2 3)
   -> (1 2 3)
这只是一个方便的特性,不必引用这样的常量列表

: ('(a b c) 6)
-> NIL
我基本上能理解为什么,但这是一个错误 皮科利普的反应令人惊讶 一个错误而不是一个错误。做 这意味着Picolisp不会进行检查 如果一个数字是一个函数,但它是 当它是一个符号

在这种情况下,(abc)实际上是一个法律功能定义:它是一个 具有单个符号参数“a”的函数(因此该函数不会 计算其参数),以及由两个符号组成的主体。这相当于 到

执行此函数时,它将参数列表(3)绑定到 符号“a”,然后执行“b”和“c”。此函数返回值 在你的例子中是零

当您这样做时:

: (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
   ?

(问题从picolisp邮件列表中删除。)是的,它不应该出错。它应该检查这一点,并在不退出REPL的情况下提供一条信息性错误消息。PicoLisp采用更为核心的方法,是一种比大多数解释语言更接近实际机器(CPU)的语言。因此,这种行为不被视为bug。正如在C中可以使进程崩溃一样,在PicoLisp中也可以。
   : (setq 7 5)  
   !? (setq 7 5)
   7 -- Variable expected
   ?