字符打印超过两次(Common Lisp)

时间:2016-04-29 05:02:02

标签: lisp common-lisp

我正在尝试根据条件语句打印出一个字符。

(defvar enctext)

   (defun encrypt(enctext) 
     (if (eq 'A (first enctext))
      (princ 'H)))

这就是我执行功能的原因

(load "lisptest.lisp")
;; Loading file lisptest.lisp ...
** - Continuable Error
DEFUN/DEFMACRO(ENCRYPT): #<PACKAGE POSIX> is locked
If you continue (by typing 'continue'): Ignore the lock and proceed
The following restarts are also available:
SKIP           :R1      skip (DEFUN ENCRYPT # ...)
RETRY          :R2      retry (DEFUN ENCRYPT # ...)
STOP           :R3      stop loading file         /home/students/cante008/cs351/lisptest.lisp
ABORT          :R4      Abort main loop
Break 1 [2]> continue
WARNING: DEFUN/DEFMACRO: redefining function ENCRYPT in
     /home/students/cante008/cs351/lisptest.lisp, was defined in C
 ;; Loaded file lisptest.lisp
T
[3]> (setf x '(A))
(A)
[4]> (encrypt x)
H
H

最后,角色&#39; H&#39;打印两次,我不知道为什么会这样。

这是我做Caesar Cipher的第一步

3 个答案:

答案 0 :(得分:2)

  

[..]一个字符[..]

当您撰写'A'H之类的内容时,您不会处理字符,而是符号。字符的写法如下:#\A#\Space。要比较字符的相等性,请使用char=

  

[..]打印两次[..]

Lisp中的大多数函数返回(至少)一个值。当你在REPL(read-evaluate-print-loop)上调用一个函数时,那么 - 作为&#34; P&#34; in&#34; REPL&#34;建议 - 调用该函数的返回值。函数的返回值为NIL(未采用if时)或princ返回的任何值。看the HyperSpec告诉我们:

  

princ object &optional output-stream =&gt; object

这应该被读作princ需要一个必需参数(一些要打印的对象)和一个可选参数(要打印到的流)和返回一个对象,这是(虽然我无法找到明确写入的内容)传递给它的同一个对象。

因此,第一个H来自princ,第二个来自REPL,它自动打印返回值。

作为最后的评论:你对defvar的使用可能表明对Common Lisp中变量的误解:defvar声明(粗略等效)你可能知道的&#34; global&#34 ;来自其他语言的变量。你不需要函数参数或传递参数。

答案 1 :(得分:2)

你没有真正测试它。

CL-USER 3 > (defun test ()
              (encrypt '(a))
              (encrypt '(a))
              (encrypt '(a))
              'lalala)
TEST

CL-USER 4 > (test)
HHH
LALALA

CL-USER 5 > (defun test1 ()
              (test)
              (test)
              (test)
              'mmmmmm)
TEST1

CL-USER 6 > (test1)
HHHHHHHHH
MMMMMM

答案 2 :(得分:0)

您正在使用REPL,因此每个表达式的值都是Printed。

(encrypt x)的值最终(在本例中)是(princ 'H)的值H

此外(princ 'H)打印H

这与您在评估(A)

后看到(setf x '(A))的原因相同