代码之家  ›  专栏  ›  技术社区  ›  Prof. Falken

picolisp问题,操作号码列表时的segfault(来自邮件列表)

  •  3
  • Prof. Falken  · 技术社区  · 15 年前

    我刚接触皮科利普。

    我试了一下,得到了一个segfault:

    : ('(1 2) 6)
    Segmentation fault
    

    但是,如果我尝试:

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

    我基本上理解原因,但令人惊讶的是,Picolisp的响应是一个segfault而不是一个错误。这是否意味着Picolisp不检查数字是否是一个函数,而是检查它是否是一个符号?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Prof. Falken    15 年前

    (从 picolisp mailing list )

    是的,这是预期的行为。

    Picolisp可能会反复评估列表中的汽车,直到它撞到 在一个函数上。函数可以是一个列表(然后是一个lisp级别 函数)或短数字(然后是内置函数,写入 ASM或C)。如果该数字不指向可执行代码 (在运行时很难检查)发生崩溃。

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

    一般来说,不可能让口译员 可能的错误(例如,考虑无限循环),所以picolisp采用 给程序员一些责任的立场。

    在实践中,像上面这样的错误首先会被检测出来。 程序的测试运行。

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

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

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

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

    我基本上理解为什么,但它是 令人惊讶的是,Picolisp的回应 一个SegFault而不是一个错误。做 这意味着Picolisp不检查 如果一个数字是一个函数,但它确实是 当它是一个符号?

    在这种情况下,(a b c)实际上是一个法律功能定义:它是 带有单个符号参数“a”的函数(这样函数就不会 评估它的参数),以及由两个符号组成的主体。这是等效的 到

       : (de foo a
          b
          c )
       -> foo
    

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

    当你这样做的时候:

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

    所以你也可以这样做:

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

    对的。

    我打赌你知道这里发生了什么;你 试图将数字用作 变量,这是非法的--gt;崩溃 (此外,这不合理 无论如何)

    你说的是对的。翻译在这个地方碰到了“1” 所需的函数参数。

       : (setq 7 5)  
       !? (setq 7 5)
       7 -- Variable expected
       ?
    
    推荐文章