Common Lisp中的字符串切换

时间:2015-09-16 05:58:51

标签: switch-statement common-lisp

如何在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"

5 个答案:

答案 0 :(得分:9)

Alexandria有宏switchcswitcheswitch

(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))))

这(不幸的是)不允许使用elseotherwise或字符串分组,但是进行该扩展应该非常简单。使用来自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"))