我试图做一个转换函数,该函数接受数字`(1 2 3)的列表并写入(“一个”,“两个”,“三个”)。这是我到目前为止的内容:
(defun translate-number (num)
(if (= num 0) (return "ZERO") ())
(if (= num 1) (return "ONE") ())
(if (= num 2) (return "TWO") ())
(if (= num 3) (return "THREE") ())
(if (= num 4) (return "FOUR") ())
(if (= num 5) (return "FIVE") ())
(if (= num 6) (return "SIX") ())
(if (= num 7) (return "SEVEN") ())
(if (= num 8) (return "EIGHT") ())
(if (= num 9) (return "NINE") ())
)
(defun translate (L)
(mapcar #'translate-number L)
)
(translate `(1 2 3))
Run Code Online (Sandbox Code Playgroud)
如果尝试运行此错误,则会收到无法弄清的错误:
*** - RETURN-FROM: no block named NIL is currently visible
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?谢谢。
return并没有用其他语言来做:]您在寻找return-from translate-number,但这不是习惯用法。
首先,您是否知道该format函数具有~R“罗马”指令?
(format nil "~R" 1) ;; => one
Run Code Online (Sandbox Code Playgroud)
如果您确实想要大写,请使用string-upcase或~( ... ~)带修饰符的format指令@::
(format nil "~@:(~R~)" 1)
;; "ONE"
Run Code Online (Sandbox Code Playgroud)
https://lispcookbook.github.io/cl-cookbook/strings.html#to-upper-case--
带格式指令的CL快速参考:http : //clqr.boundp.org/
所以:
(mapcar (lambda (nb)
(format nil "~@:(~R~)" nb))
'(1 2 3))
("ONE" "TWO" "THREE")
Run Code Online (Sandbox Code Playgroud)
连续许多if您可以使用case或cond。
(defun translate-number (num)
(case num
(1 "ONE")
(2 "FOO")))
Run Code Online (Sandbox Code Playgroud)
()的第二种形式无需作废if。
https://learnxinyminutes.com/docs/common-lisp/ ;)
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |