gpt4 book ai didi

lisp - Picolisp 问题,操作数字列表时出现段错误(来自邮件列表)

转载 作者:太空宇宙 更新时间:2023-11-03 18:43:21 32 4
gpt4 key购买 nike

我是 Picolisp 的新手。

我试过了,得到了一个段错误:

: ('(1 2) 6)
Segmentation fault

但是,如果我尝试:

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

我基本上理解为什么,但令人惊讶的是 PicoLisp 以段错误而不是错误作为响应。这是否意味着 Picolisp 不检查数字是否为函数,但在它是符号时检查?

最佳答案

(从 picolisp mailing list 中提取。)

是的,这是预期的行为。

PicoLisp 计算列表的 CAR,可能会重复计算,直到它命中在一个函数上。一个函数要么是一个列表(那么它就是一个 Lisp 级别的函数)或一个短数字(那么它是一个内置函数,写在asm 或 C)。如果该数字不指向可执行代码(这在运行时很难检查),会发生崩溃。

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

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

在实践中,像上面这样的错误会在第一时间被检测到测试运行您的程序。

顺便说一句,上述规则的一个异常(exception)只是一个列表直接有一个其 CAR 中的编号。这样的列表会自动评估:

   : (1 2 3)
-> (1 2 3)

只是一个方便的特性,不必引用这样的常量列表。

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

I mostly understand why, but it was a surprise that Picolisp responded with a segfault instead of an error. Does this means that Picolisp doesn't check if a number is a function but it does when it is a symbol?

在那种情况下,(a b c) 实际上是一个合法的函数定义:它是一个具有单个符号参数 'a' 的函数(因此该函数不评估其参数)和两个符号的主体。这是等价的到

   : (de foo a
b
c )
-> foo

执行此函数时,它将参数列表 (3) 绑定(bind)到符号'a',然后执行'b'和'c'。这个函数返回值'c',在您的示例中为 NIL。

When you do:

: (de foo H H) 

: (foo 1 2 3)
-> (1 2 3)

: foo
-> (H H)

so you can also do:

: ('(H H) 1 2 3)
-> (1 2 3)

正确。

I bet you know what happens here; you are trying to use a number as a variable, which is illegal -> crash (besides it does not make sense anyway)

你说的对。口译员在这个地方碰到了“1”一个预期的函数参数。

   : (setq 7 5)  
!? (setq 7 5)
7 -- Variable expected
?

关于lisp - Picolisp 问题,操作数字列表时出现段错误(来自邮件列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1713394/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com