我在这里有一个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列表底部的名称变量保留动物列表的大小写,例如,Cat
应该打印Cat
而不是{{1并且CAT
应打印为Bear
而不是Bear
。我查看了互联网3个小时并得到了nada ...我得到了大写,小写没有保留案例...所以如果有人可以帮助我在上面的代码中保留最终变量BEAR
的输出的情况在函数name
中,同时保持lookup-animal
的红色而不是PRINC
的粉红色......我真的很感激......
由于
编辑:
这是我目前的代码......它只是打印" NAME"而不是数据。 SYMBOL-NAME正在REPL工作,因为我不了解这一变化......我仍然可以帮助找出如何保留cons细胞数据的情况。
FORMAT
答案 0 :(得分:1)
您要打印出符号,而不是字符串。按照惯例,lisp中的符号阅读器以大写形式读取符号(因此,当您编写它们时,它们将被写为大写字符串)。
您可以为阅读器更改此行为,如下所示:
(setf (readtable-case *readtable*) :preserve)
然后,打印可能会以您希望的方式工作。或者,您可能需要致电:
(SYMBOL-NAME 'Cat)
答案 1 :(得分:0)
我不建议lisp初学者修改readtable-case。很少有常见的lisp程序使用该工具。
首先,你应该熟悉符号和字符串之间的区别,以及 print-case 和 read-case 的作用。
学习如何使用格式将是一项你可以使用很多的技能,你会找到可以很好地控制输出的工具。
> (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
>
答案 2 :(得分:0)
您可以使用竖线保留符号的大小写("竖线符号"):
? (defparameter l '((cat . |Kitten|) (bear . |Cub|)))
L
? l
((CAT . |Kitten|) (BEAR . |Cub|))
然后
? (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