Common lisp 公共Lisp中重复的case语句

Common lisp 公共Lisp中重复的case语句,common-lisp,Common Lisp,这里一定有更好的方法,对吧 (format t "Enter your age: ~%") (defun age-case (age) (case age (1 (format t "You belong in Kindergarden~%")) (2 (format t "You belong in Kindergarden~%")) (3 (format t "You belong in Ki

这里一定有更好的方法,对吧

(format t "Enter your age: ~%")

(defun age-case (age)
  (case age
    (1 (format t "You belong in Kindergarden~%"))
    (2 (format t "You belong in Kindergarden~%"))
    (3 (format t "You belong in Kindergarden~%"))
    (4 (format t "You belong in Kindergarden~%"))
    (5 (format t "You belong in Preschool~%"))
    (6 (format t "Elementary school ~%"))
    (t (format t "Somewhere else"))))

(defvar *age* (read))

(age-case *age*)
Python中的P>我会使用1…4的例子,在C++、java和Co中,我可能会使用一个故障切换的情况,在1到3的情况下,我不需要中断。在没有代码复制的clisp中,有没有一个巧妙的小技巧可以做到这一点?

您可以这样使用:

(defun age-test ()
  (format t "Enter your age: ~%")
  (finish-output)
  (let ((age (read)))
    (format t (cond ((member age '(1 2 3 4)) "You belong in Kindergarden~%")
                    ((= age 5) "You belong in Preschool~%")
                    ((= age 6) "Elementary school ~%")
                    (t "Somewhere else")))))

(age-test)

case
子句可以接受多个键:

(取消年龄案例(年龄)
(病例年龄)
((1 2 3 4)(格式t“您属于幼儿园~%”)
(5)(格式t“您属于学龄前儿童~%”)
(6)(格式t“小学~%”)
(t(格式t“其他地方”))
如果范围过于繁琐,无法手动填写,例如
1到100
,最好使用
cond

(续)

((另一个选项是使用类型说明符:

CL-USER > (let ((age 6))
            (typecase age
              ((integer 1 4) 'one-to-four)   ; integers from 1 to 4
              ((eql 5)       'five)
              ((eql 6)       'six)
              (t             'something-else)))
SIX
(