我正在尝试根据条件语句打印出一个字符。
(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的第一步
答案 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))
的原因相同