Common lisp 在Common Lisp中,如何保留变量输出的情况

Common lisp 在Common Lisp中,如何保留变量输出的情况,common-lisp,Common Lisp,我这里有一个cons单元格列表的变量 (defparameter lookup-animal '((Cat . kitten) (Bear . cub) (Cow . calf))) 下面是我用来解析它们的函数 (defun lookup-animal (name type) (if (eq type 'old) (setf name (car (assoc name lookup-animal))) (if (eq type 'young) (setf name

我这里有一个cons单元格列表的变量

 (defparameter lookup-animal  '((Cat . kitten) (Bear . cub) (Cow . calf)))
下面是我用来解析它们的函数

(defun lookup-animal (name type)
  (if (eq type 'old)
    (setf name (car (assoc name lookup-animal)))
  (if (eq type 'young)
    (setf name (cdr (assoc name lookup-animal)))))
  name)

 I run (lookup-animal 'Cat 'old) and it would output > CAT
 I run (lookup-animal 'Cat 'YOUNG) and it would output > KITTEN
问题是我希望defun lookup animal列表底部的name变量保留动物列表的大小写,例如,
Cat
应该打印
Cat
not
Cat
,而
Bear
应该打印为
Bear
not
Bear
。我在网上查了3个小时得到了nada…我得到了大写字母,小写无保留大小写…因此,如果有人能在上面的代码中帮助我在函数
查找动物
中保留最后一个变量
name
的输出大小写,同时将其保留为
PRINC
的红色,而不是
格式的粉红色,我将非常感激

谢谢

编辑:

这是我当前的代码…它只是打印“名称”而不是数据。SYMBOL-NAME当时在REPL工作,因为我不理解更改…我仍然可以使用帮助找出如何保存cons单元格数据的大小写

(defun lookup (name language o)
    (if (eq language 'lisp)
      (setf name (car (assoc name lookup)))
    (if (eq language 'C++)
      (setf name (cdr (assoc name lookup)))))

(setf (readtable-case *readtable*)  :preserve)
(SETF O (SYMBOL-NAME 'NAME))
(SETF (READTABLE-CASE *READTABLE*)  :UPCASE)
o)

您打印的是符号,而不是字符串。按照惯例,lisp中的符号读取器以大写形式读取符号(因此,当您开始编写符号时,它们被写成大写字符串)

您可以为读取器更改此行为,如下所示:

(setf (readtable-case *readtable*) :preserve)
那么,打印可能会按照您想要的方式工作。或者,您可能需要致电:

(SYMBOL-NAME 'Cat)

我不建议lisp初学者修补可读性案例。很少有常见的lisp程序使用这种工具

首先,您应该熟悉符号和字符串之间的区别,以及打印大小写和读取大小写的作用

学习如何使用格式将是一项您可以大量使用的技能,在这项技能中,您将找到对输出进行精细控制的工具

> (let ((*print-case* :upcase)) (format t "~A ~(~A~) ~@(~A~) ~:(~A~) ~:@(~A~)" 'cow 'cow 'cow 'cow 'cow))
COW cow Cow Cow COW
nil
> (let ((*print-case* :downcase)) (format t "~A ~(~A~) ~@(~A~) ~:(~A~) ~:@(~A~)" 'cow 'cow 'cow 'cow 'cow))
cow cow Cow Cow COW
nil
> 

可以保留带有竖条的符号(“管道符号”)的大小写:

然后

如果要打印不带条的符号,请执行以下操作:

? (princ (cdr (assoc 'cat l)))
Kitten                    ; printout
|Kitten|                  ; return value
? (format t "Meow said the ~a" (cdr (assoc 'cat l)))
Meow said the Kitten      ; printout
NIL                       ; return value

请参阅和。

以下是有关common lisp中符号大小写的一些信息:-可能值得考虑是否最好将数据的符号表示形式与表示格式分开---这可以通过从符号到字符串的附加关联列表来实现。@user3411335:我相信关于可读大小写:链接问题中的反转将产生您试图产生的行为。我注意到当我运行
(setf(readtable case*readtable*):preserve)
时,我无法输入任何函数,除非它们是大写的…所以我尝试了
(setf(readtable case*readtable*):preserve)
然后运行函数,然后运行
(setf(readtable case*readtable*):downcase)
要反转,现在我不能运行任何大写或小写的函数,除非我重新启动emacs…..谢谢你回到正题上来:)…那么什么是相反的:保留…因为你说的话有效,但有副作用。我想你想运行
(setf(readtable case*readtable*):upcase)
以恢复。也就是说,您打印的是一个符号,而不是字符串。打印符号可能是个坏主意——这是一种糟糕的代码气味。你可能想打印一个字符串。谢谢你的回答。它教会了我很多东西,但我在帖子中强调的不够,我确实需要保留大小写字母…我应该提到,我不知道这些单词在解析前会是什么样子,但无论如何,我都必须保留字母的原样……所以如果我解析“caT”,我需要函数来打印“caT”。。抱歉,我强调得不够:)…我现在理解你的观点,并会相应地调整未来的帖子。@blueberryfields你能看看我最新的编辑吗…可以请人教我怎么做吗it@Thank非常感谢你…我在网上找不到这些信息…多么简单优雅的答案…我接受了你的答案并投票祝你生日快乐不客气,我很高兴能帮上忙;-)
? (assoc 'cat l)
(CAT . |Kitten|)
? (cdr (assoc 'cat l))
|Kitten|
? (type-of (cdr (assoc 'cat l)))
SYMBOL
? (princ (cdr (assoc 'cat l)))
Kitten                    ; printout
|Kitten|                  ; return value
? (format t "Meow said the ~a" (cdr (assoc 'cat l)))
Meow said the Kitten      ; printout
NIL                       ; return value