Lisp 如何删除此文本中的括号

Lisp 如何删除此文本中的括号,lisp,common-lisp,sbcl,Lisp,Common Lisp,Sbcl,所以我的导师给了我一个任务,让我做一个小函数,返回对你的星座的描述,但是我对星座描述的最终输出有问题,输出仍然在括号中,我不知道如何把它们取出来 (defparameter *month-signs* '((January Capricorn Aquarius 19 nil) (February Aquarius Pisces 18 nil) ....))) (defparameter *sign-traits* '

所以我的导师给了我一个任务,让我做一个小函数,返回对你的星座的描述,但是我对星座描述的最终输出有问题,输出仍然在括号中,我不知道如何把它们取出来

(defparameter *month-signs* '((January Capricorn Aquarius 19 nil)
                   (February Aquarius Pisces 18 nil)
                    ....)))

(defparameter *sign-traits* '((Capricorn (You are a goat be happy!))
                              ....)))

(defun cookie (month-signs sign-traits)
  (format t "Please input your month of birth followed by return, and then your day of birth.
e.g january <ret> 22 <ret> Thank You. ~%")
  (let* ((month (read t));reads in month of birth
         (day (read t));reads in day of birth
         (month-assoc (assoc month month-signs)))
    (cond
      ((>=(cadddr month-assoc)day);checks if your sign is the first part of the month
       (format t "You are ~D~%" (cadr month-assoc));if it is, prints your sign and signs description
       (format t "Your sign description is: ~D~%" (cadr(assoc(cadr month-assoc) sign-traits))))
      ((< (cadddr month-assoc)22);same as above but for the other sign
       (format t "You are ~D~%" (caddr month-assoc))
       (format t "Your sign description is: ~D~%" (cadr(assoc(caddr month-assoc) sign-traits)))))))
(参数*月份符号*)(1月摩羯-水瓶座19无)
(2月水瓶座双鱼座18零)
....)))
(摩羯座(你是一只快乐的山羊!))
....)))
(defun cookie(月符号特征)
(格式t“请输入您的出生月份,然后是申报表,然后是您的出生日期。
e、 g 1月22日谢谢~%”)
让*((月(读t));读出生月份
(日(读t));读出生日
(关联月(关联月号)))
(续)
((>=(CADDR月关联)日);检查您的签名是否为该月的前半部分
(格式t“您是~D~%”(cadr月协会));如果是,则打印您的标志和标志说明
(格式t“您的符号描述为:~D~%”(cadr(cadr月assoc)符号特征)
(<(CADDR月协会)22);与上述相同,但用于其他符号
(格式t“你是~D~%”(caddr月协会))
(格式t“您的符号描述为:~D~%”(cadr(cadr月协会)符号特征()()())())))
除了这个“cadr(cadr month assoc)sign traits”(cadr-month assoc)符号特征),它返回我想要的东西,但是在括号和所有的大写字母中

CL-USER> (cookie *month-signs* *sign-traits*)
Please input your month of birth followed by return, and then your day of birth.
e.g january <ret> 22 <ret> Thank You. 
january
12
You are CAPRICORN
Your sign description is: (YOU ARE A GOAT BE HAPPY)
CL-USER>(cookie*月份符号**符号特征*)
请输入您的出生月份,然后输入报税表,然后输入您的出生日期。
e、 g 1月22日谢谢。
一月
12
你是摩羯座
你的标志描述是:(你是一只快乐的山羊)
我真的很难弄清楚我需要什么来摆脱
(你是山羊快乐)
在最后一点,我希望它只是打印“你的标志描述是:你是山羊快乐。”这可能是我错过的一些明显的东西:\ 还有一件事……只是为了你的缘故,因为变量很大,会占用大量的页面空间,我缩小了它,因为它们的布局都是一样的。

在列表中
”(1月摩羯座-水瓶座19-nil)
,前三个元素是符号,由REPL以大写形式打印出来。符号不同于字符串。当您引用这样的列表时,文本被视为符号,而不是字符串

类似地,
”(你是一只快乐的山羊!)
是一个由六个符号组成的列表。它以大写符号列表(括在括号中)的形式打印出来

如果将符号和列表替换为字符串:

(defparameter *month-signs* '((January "Capricorn" "Aquarius" 19 nil)...

(defparameter *sign-traits* '((Capricorn "You are a goat be happy!")...
你应该得到你想要的输出


read
将输入作为符号,因此您希望将关联键(1月)作为符号保留。

使用符号打印列表

Common Lisp可以以多种方式打印符号。函数
WRITE
为打印机提供了一个基本接口。我们不想打印字符串引号,我们想控制单词的大写方式

(defun write-sentence (sentence
                       &aux                       ; local variable bindings
                       (*print-escape* nil)       ; no escaping
                       (*print-readably* nil))    ; we don't print for the reader
  (write (first sentence) :case :capitalize)   
  (dolist (word (rest sentence))
    (write " ")
    (write word :case :downcase))
  (write ".")
  (values))                           ; return no values

CL-USER 94 > (write-sentence '(YOU ARE A GOAT BE HAPPY))
You are a goat be happy.
原则

以人类可读的形式打印的标准函数是
PRINC
。除了可选地指定输出流之外,它不提供选项。这些选项需要绑定在打印机控制变量中。这里我们需要告诉
PRINC
使用哪种情况:

格式

类似的功能可以使用函数
FORMAT
以更简洁的方式编写,该函数包括迭代列表的功能。此示例仅作为一个练习来解释:

CL-USER 115 > (format t
                      "~{~@(~A~)~@{ ~(~A~)~}~}."
                      '(YOU ARE A GOAT BE HAPPY))
You are a goat be happy.
符号中的大小写

还可以使用大小写指定符号。它们需要在源代码中转义:

|This is a single symbol in Common Lisp!|

谢谢!我真的不觉得奇怪,这是如此明显的事情。谢谢你的深入回答,很多问题我都不明白,因为我刚刚做的这个函数是我第一次尝试使用格式。格式包含在Common Lisp的温和指南中,所以当我开始使用它时,我会跳过它。我去安装了Emacs、SBCL、QL和Slime,所以我希望使用我的格式ting好多了:P
|This is a single symbol in Common Lisp!|