Common lisp 在Common Lisp中,如何保留变量输出的情况
我这里有一个cons单元格列表的变量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
(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
notCat
,而Bear
应该打印为Bear
notBear
。我在网上查了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