学习LISP。为什么NIL在函数结束后使用if语句打印出来

学习LISP。为什么NIL在函数结束后使用if语句打印出来,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,嗨,这里的新手正在学习lisp,我很困惑为什么lisp会在输出的末尾打印出NIL?有没有办法不打印NIL或者if语句设置不正确 (defun greater (x) (if (> x 4) (message "number is greater than 4"))) 得到结果: [2]> (square 10) number greater than 4 NIL 这只是函数的返回值。REPL(交互式计算)显示输入的每个表达式的结果。调用gr

嗨,这里的新手正在学习lisp,我很困惑为什么lisp会在输出的末尾打印出NIL?有没有办法不打印NIL或者if语句设置不正确

(defun greater (x) 
  (if (> x 4) 
    (message "number is greater than 4")))
得到结果:

    [2]> (square 10)
    number greater than 4
    NIL

这只是函数的返回值。REPL(交互式计算)显示输入的每个表达式的结果。调用
greater
函数的结果是
NIL

这只是函数的返回值。REPL(交互式计算)显示输入的每个表达式的结果。调用
greater
函数的结果是
NIL

所有顶级表单都将通过Read-Eval-Print循环打印。以下是如何避免它:

;;; make a main function
(defun main () 
  ;; all your program top level forms here!
  (values)) ; empty values return no value and the REPL will not print anything when your program terminates

;; call main
(main)

当然,在交互式会话中,您希望将结果打印出来,这样您就可以输入
(+23)
,并返回
5
,而无需将其包装在打印语句中

所有顶级表单都通过Read-Eval-Print循环打印。以下是如何避免它:

;;; make a main function
(defun main () 
  ;; all your program top level forms here!
  (values)) ; empty values return no value and the REPL will not print anything when your program terminates

;; call main
(main)

当然,在交互式会话中,您希望将结果打印出来,这样您就可以输入
(+23)
,并返回
5
,而无需将其包装在打印语句中

结果是否参考给定代码(代码定义函数<代码>较大值,而结果中使用函数<代码>正方形)?结果是否参考给定代码(代码定义函数<代码>较大值,,而结果中使用函数<代码>正方形)我不同意你的编辑。“交互式评估”是什么意思?REPL中的E代表
eval
而不是“解释器”。评估可以使用编译器,就像SBCL和CCL一样。在本例中,CLISP有一个基于解释器的REPL,但通常情况并非如此。REPL是一个交互式解释器,无论它在幕后如何实现。它的评估部分不是交互式的:您键入表单,将其发送给口译员进行评估,然后返回结果。CCL/SBCL/。。。别那样。他们接受表达式,编译并执行它。没有涉及Lisp解释器。Lisp上下文中的术语解释器意味着直接执行Lisp表单(参见McCarthy,Lisp 1)。CCL/SBCL/。。。不要那样做。他们编译表达式并调用编译后的代码。在评估中。SBCL
*(lambda(x)x)->然后(描述*)->。。。[compiled function]…
因此,REPL中的重要部分是评估,而不是如何实现。@melpomene只有在定义“解释器”与计算人员(特别是lisp人员)的定义不同时,它才是解释器。根据你的定义,传统的“教育”;复写的副本;a、 out的C开发过程也是一个解释器。有时使用各种各样的定义很有趣,但几乎毫无帮助。@RainerJoswig我不同意你的编辑。“交互式评估”是什么意思?REPL中的E代表
eval
而不是“解释器”。评估可以使用编译器,就像SBCL和CCL一样。在本例中,CLISP有一个基于解释器的REPL,但通常情况并非如此。REPL是一个交互式解释器,无论它在幕后如何实现。它的评估部分不是交互式的:您键入表单,将其发送给口译员进行评估,然后返回结果。CCL/SBCL/。。。别那样。他们接受表达式,编译并执行它。没有涉及Lisp解释器。Lisp上下文中的术语解释器意味着直接执行Lisp表单(参见McCarthy,Lisp 1)。CCL/SBCL/。。。不要那样做。他们编译表达式并调用编译后的代码。在评估中。SBCL
*(lambda(x)x)->然后(描述*)->。。。[compiled function]…
因此,REPL中的重要部分是评估,而不是如何实现。@melpomene只有在定义“解释器”与计算人员(特别是lisp人员)的定义不同时,它才是解释器。根据你的定义,传统的“教育”;复写的副本;a、 out的C开发过程也是一个解释器。有时使用各种各样的定义是有趣的,但几乎没有帮助。