如何从此文本中删除括号
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!|
所以我的导师给我的任务是制作一个小函数,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!|