如何从此文本中删除括号

How to remove the brackets from this text

所以我的导师给我的任务是制作一个小函数,returns 描述你的星座,但我对星座描述的最终输出有问题,输出是还在括号里,不知道怎么去掉。

(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)))))))

除了这个 returns 我想要的“(cadr(assoc(caddr month-assoc) sign-traits)”,一切都很好,但在括号和全部大写中。

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)

我真的很难弄清楚我需要什么来摆脱最后一点的 (YOU ARE A GOAT BE HAPPY),我希望它只打印 "Your sign description is: You are a goat be happy." 这可能很明显我错过了:\ 还有一件事....只是为了你好,因为变量很大,会占用大量页面space,我把它精简了,因为它们的布局都是一样的。

在列表'(January Capricorn Aquarius 19 nil)中,前三个元素是symbols,由REPL以大写形式打印出来。符号不同于字符串。当您引用这样的列表时,文字将被视为符号,而不是字符串。

类似地,'(You are a goat be happy!) 是一个包含六个符号的列表。它作为大写符号列表(括在括号中)打印出来。

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

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

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

你应该得到你想要的输出。

read将输入作为一个符号,所以你想把关联键(一月)作为一个符号。

打印带有符号的列表

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。除了可选地指定输出流之外,它不提供选项。那些需要绑定在打印机控制变量中。这里我们需要告诉 PRINC 使用哪个 case:

(defun write-sentence (sentence)
  (let ((*print-case* :capitalize))
    (princ (first sentence)))
  (dolist (word (rest sentence))
    (princ " ")
    (let ((*print-case* :downcase))
      (princ word)))
  (princ ".")
  (values))

格式

可以使用函数 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!|