Common Lisp 中的重复案例陈述
Duplicated case statement in 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 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 中,我会为此使用案例 1..4,在 C++ 中,Java 和 co。我可能会使用 falltrough switch 案例,其中我省略了案例 1 到 3 的中断。在 clisp w/o 代码重复中是否有一个巧妙的小技巧来做到这一点?
(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
子句可以接受多个键:
(defun age-case (age)
(case age
((1 2 3 4) (format t "You belong in Kindergarden~%"))
(5 (format t "You belong in Preschool~%"))
(6 (format t "Elementary school ~%"))
(t (format t "Somewhere else"))))
Rainer 的解决方案使用 integer
类型中提供的范围 typecase
:
(typecase age
((integer 1 4) 'one-to-four)
((eql 5) 'five)
((eql 6) 'six)
(t 'something-else)))
在此基础上,您可以“免费”进行类型检查:
(etypecase age
((integer 1 4) 'one-to-four)
((eql 5) 'five)
((eql 6) 'six)
((integer 7 *) 'something-else)))
或者,您也可以使用 cond
:
(cond
((<= 1 age 100) 'one-to-ahundred)
;; ...and so on.
)
另一种选择是使用类型说明符:
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
这里一定有更好的方法,对吧?
(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 中,我会为此使用案例 1..4,在 C++ 中,Java 和 co。我可能会使用 falltrough switch 案例,其中我省略了案例 1 到 3 的中断。在 clisp w/o 代码重复中是否有一个巧妙的小技巧来做到这一点?
(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
子句可以接受多个键:
(defun age-case (age)
(case age
((1 2 3 4) (format t "You belong in Kindergarden~%"))
(5 (format t "You belong in Preschool~%"))
(6 (format t "Elementary school ~%"))
(t (format t "Somewhere else"))))
Rainer 的解决方案使用 integer
类型中提供的范围 typecase
:
(typecase age
((integer 1 4) 'one-to-four)
((eql 5) 'five)
((eql 6) 'six)
(t 'something-else)))
在此基础上,您可以“免费”进行类型检查:
(etypecase age
((integer 1 4) 'one-to-four)
((eql 5) 'five)
((eql 6) 'six)
((integer 7 *) 'something-else)))
或者,您也可以使用 cond
:
(cond
((<= 1 age 100) 'one-to-ahundred)
;; ...and so on.
)
另一种选择是使用类型说明符:
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