常见的Lisp映射到单词

Kos*_*Kos 0 lisp common-lisp

我试图做一个转换函数,该函数接受数字`(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)

有任何想法吗?谢谢。

Ehv*_*nce 8

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您可以使用casecond

(defun translate-number (num)
   (case num
     (1 "ONE")
     (2 "FOO")))
Run Code Online (Sandbox Code Playgroud)

()的第二种形式无需作废if

https://learnxinyminutes.com/docs/common-lisp/ ;)