【问题标题】:common lisp - ch 02, code error?common lisp - ch 02,代码错误?
【发布时间】:2011-09-05 04:02:57
【问题描述】:

我已经在我的 fedora-13 机器上安装了 clisp。在 clisp 解释器中,我输入了以下内容:

(defun ask-num ()
    (format t "Please enter a number.")
    (let ((val (read)))
        (if (numberp val)
            val
            (ask-num))))

这是 Paul Graham 书中的原始代码:

(defun ask-number ()
  (format t "Please enter a number. ")
  (let ((val (read)))
    (if (numberp val)
        val
        (ask-number))))

有什么我错过的吗?这似乎更像是解释器的特质,而不是代码中的错误。 Here 是链接。对于有问题的代码,您可能必须按 ctrl-F。

更新:哈哈,对……问题!

[9]> (defun ask-num ()
    (format t "Please enter a number.")
    (let ((val (read)))
        (if (numberp val)
            val
            (ask-num))))
ASK-NUM
[10]> ask-num

*** - SYSTEM::READ-EVAL-PRINT: variable ASK-NUM has no value
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead of ASK-NUM.
STORE-VALUE    :R2      Input a new value for ASK-NUM.
ABORT          :R3      Abort main loop

【问题讨论】:

  • 您有什么遗漏的吗?是的,这是您遇到的实际 问题 :-) 该代码在我的 Ubuntu clisp 上运行良好。

标签: clisp


【解决方案1】:

您应该输入(ask-num),而不是ask-num,以便让CLISP 执行您的函数。

[1]> (defun ask-num ()
    (format t "Please enter a number.")
    (let ((val (read)))
        (if (numberp val)
            val
            (ask-num))))
ASK-NUM
[2]> (ask-num)
Please enter a number.1
1
[3]> ask-num

*** - SYSTEM::READ-EVAL-PRINT: variable ASK-NUM has no value
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead of ASK-NUM.
STORE-VALUE    :R2      Input a new value for ASK-NUM.
ABORT          :R3      Abort main loop
Break 1 [4]> 

【讨论】:

    【解决方案2】:

    由于你没有指出你遇到的问题,我能做的最好的就是尝试复制它。

    但是,该代码在带有 CLISP 2.44.1 的 Ubuntu 10 下运行良好:

    pax@pax-desktop:~$ clisp
    
      i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
      I I I I I I I      8     8   8           8     8     o  8    8
      I  \ `+' /  I      8         8           8     8        8    8
       \  `-+-'  /       8         8           8      ooooo   8oooo
        `-__|__-'        8         8           8           8  8
            |            8     o   8           8     o     8  8
      ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8
    
    Welcome to GNU CLISP 2.44.1 (2008-02-23) <http://clisp.cons.org/>
    
    Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
    Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
    Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
    Copyright (c) Bruno Haible, Sam Steingold 1999-2000
    Copyright (c) Sam Steingold, Bruno Haible 2001-2008
    
    Type :h and hit Enter for context help.
    
    [1]> (defun ask-num ()
        (format t "Please enter a number.")
        (let ((val (read)))
            (if (numberp val)
                val
                (ask-num))))
    ASK-NUM
    [2]> (ask-num)
    Please enter a number.hello
    Please enter a number.goodbye
    Please enter a number.3141592653589
    3141592653589
    [3]> 
    

    所以,我真正能建议的就是你尝试完全按照上面的成绩单显示的那样做。如果仍然有问题,请确保您拥有最新版本的 CLISP,并根据您遇到的实际问题更新问题(所有好的问题都应该具有预期的实际行为以及导致的情况解决问题)。


    现在您已经发布了您的实际错误,我们可以看到这只是您如何调用函数的简单问题。您必须使用(ask-num) 调用它,如您提供的链接中所述:

    (ask-number)
    Please enter a number. a
    Please enter a number. (ho hum)
    Please enter a number. 52
    52
    

    您收到该错误的原因是因为一个朴素的ask-num 被评估为一个变量(实际上,它是一个函数)。你可以在这里看到它的实际效果:

    pax@pax-desktop:~$ clisp
    : : : : :
    Type :h and hit Enter for context help.
    
    [1]> 42
    42
    [2]> myvar
    
    *** - EVAL: variable MYVAR has no value
    The following restarts are available:
    USE-VALUE      :R1      You may input a value to be used instead of MYVAR.
    STORE-VALUE    :R2      You may input a new value for MYVAR.
    ABORT          :R3      Abort main loop
    Break 1 [3]> (set 'myvar 42)
    42
    Break 1 [3]> myvar
    42
    Break 1 [3]>
    

    【讨论】:

      【解决方案3】:

      正如 paxdiablo 所说,clisp 试图将 ask-num 评估为变量。 Common Lisp 对函数和其他类型的值有单独的命名空间。您可能希望函数仅被视为一个恰好是闭包的值,但它们是单独存储和查找的。​​p>

      如果你确实想要关闭,你可以输入

      [1]> #'ASK-NUM
      

      返回

      #<FUNCTION ASK-NUM NIL (DECLARE (SYSTEM::IN-DEFUN ASK-NUM))
        (BLOCK ASK-NUM (FORMAT T "Please enter a number.")
         (LET ((VAL (READ))) (IF (NUMBERP VAL) VAL (ASK-NUM))))>
      

      您可以在此处阅读更多信息:http://en.wikipedia.org/wiki/Common_Lisp#The_function_namespace

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-25
        相关资源
        最近更新 更多