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

时间:2014-03-21 00:29:10

标签: 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 (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

3 个答案:

答案 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

请参阅herehere