如何在Common Lisp中对字符串进行条件分派?我正在寻找类似的东西:
string Message = "";
try
{
string MMF_In_Name = "Global\\MMF_Name";
MemoryMappedFile MMF_In = MemoryMappedFile.OpenExisting(MMF_In_Name);
Messages.Add("Connected to MMF");
}
catch (Exception ex)
{
Messages.Add(ex.Message);
}
so(case" a")返回"找到a"
答案 0 :(得分:9)
Alexandria有宏switch
,cswitch
,eswitch
:
(switch (str :test #'equal)
("a" "found an a")
("abc" "found an abc")
(t "other"))
答案 1 :(得分:6)
string-case库实现了此功能。它可以从quicklisp获得。
答案 2 :(得分:1)
一个微不足道(可能很慢)的变体将是:
(defmacro string-case (str &rest forms)
(let* ((strval (gensym "STRVAL"))
(cond-body (loop for (s . f) in forms
collect `((string= ,strval ,s) ,@f))))
`(let ((,strval ,str)) (cond ,@cond-body))))
这(不幸的是)不允许使用else
,otherwise
或字符串分组,但是进行该扩展应该非常简单。使用来自quicklisp的现有字符串case可能是更好的选择。
答案 3 :(得分:0)
这是来自Seibel的Practical Common LISP,只有使用read-char而不是read-line进行的更改。这对我使用简单的字符" A" " B"要查看字符和字符串实际使用的是什么(格式为nil"〜:C" c)c为字符,并且(格式为nil"〜:S" s)为字符串。
(defun prompt-read(prompt)
(format *query-io* "~a: " prompt)
(force-output *query-io*)
(read-char *query-io*))
(defun move()
(case(prompt-read "ROW[A-C]")
(#\A (print "A"))
(#\B (print "B"))
(#\C (print "C"))))
答案 4 :(得分:-2)
我能够通过将字符串转换为符号来实现它:
(case (intern (string-upcase str))
(a "found an a")
(abc "found an abc")
(otherwise "other"))