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
?