gpt4 book ai didi

lisp - 字符打印两次以上(Common Lisp)

转载 作者:太空宇宙 更新时间:2023-11-03 18:57:07 26 4
gpt4 key购买 nike

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

(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

在最后字符“H”打印了两次,我不确定为什么会这样。

这是我做凯撒密码的第一步

最佳答案

[..] a character [..]

当您编写诸如 'A'H 之类的内容时,您处理的不是字符而是符号。字符这样写:#\A#\Space。要比较字符是否相等,请使用 char= .

[..] prints twice [..]

Lisp 中的大多数函数(至少)返回一个值。当您在 REPL 上调用一个函数时(读取-评估-打印-循环),然后 - 正如“REPL”中的“P”所暗示的那样 - 打印调用该函数的返回值。您的函数的返回值是 NIL(当 if 未被采用时)或 princ 返回的任何值。看着the HyperSpec告诉我们:

princ object &optional output-stream => object

这将被解读为 princ 接受一个必需参数(要打印的某个对象)和一个可选参数(要打印到的流)并返回一个对象,这是(虽然我找不到明确写的)传递给它的同一个对象。

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

作为最后的评论:您对 defvar 的使用可能显示出对 Common Lisp 中变量的误解:defvar 声明(大致等同于)您可能知道的“来自其他语言的全局”变量。函数参数或传递参数不需要它。

关于lisp - 字符打印两次以上(Common Lisp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36929910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com