如何根据elisp中的一个条件设置一组变量?

如何根据elisp中的一个条件设置一组变量?,lisp,elisp,Lisp,Elisp,假设我想根据一个条件设置bar和baz的值,这两种情况下都是相同的,比如foo的值。使用let特殊形式,我可以这样做 (let ((bar (if foo 1 2)) (baz (if foo 3 4))) ... ) 虽然上面的程序是正确的,但它检查foo的值两次似乎有点奇怪。在这种情况下,有没有一个惯用的表达式可以用来避免重复检查?您可以使用cl lib.el提供的多个值,这是Emacs的常见Lisp扩展: 您可能希望在单独的函数中提取这两种情况。您可以使用cl lib.e

假设我想根据一个条件设置
bar
baz
的值,这两种情况下都是相同的,比如
foo
的值。使用let特殊形式,我可以这样做

(let ((bar (if foo 1 2))
      (baz (if foo 3 4)))
  ... )

虽然上面的程序是正确的,但它检查
foo
的值两次似乎有点奇怪。在这种情况下,有没有一个惯用的表达式可以用来避免重复检查?

您可以使用
cl lib.el
提供的多个值,这是Emacs的常见Lisp扩展:


您可能希望在单独的函数中提取这两种情况。

您可以使用
cl lib.el
提供的多个值,这是Emacs的常见Lisp扩展:


您可能希望在单独的函数中提取这两种情况。

我在elisp中能想到的唯一答案(没有多个值)是这样的:

(apply (lambda (bar baz)
         ...)
       (if foo
           (list 1 2)
         (list 3 4)))
一般来说,这是consy,不过显然,在可以提供文本列表的情况下,不需要这样做

你可以把它包装成一个宏:下面就是这样,尽管它非常需要一些错误检查(elisp太烦人了,我不想在上面花更多的时间——至少现在它有回溯)

然后表达式将变成(这次使用文本列表)


在elisp中我能想到的唯一答案(没有多个值)是这样一个非常可怕的东西:

(apply (lambda (bar baz)
         ...)
       (if foo
           (list 1 2)
         (list 3 4)))
一般来说,这是consy,不过显然,在可以提供文本列表的情况下,不需要这样做

你可以把它包装成一个宏:下面就是这样,尽管它非常需要一些错误检查(elisp太烦人了,我不想在上面花更多的时间——至少现在它有回溯)

然后表达式将变成(这次使用文本列表)


您不必在let表单本身中设置值。let表单创建本地绑定,然后可以根据需要设置值

(let(bar baz)
(如果是foo
(设定值1)
baz(2)
(设定值3)
baz(4))
...)

您无需在let表单本身中设置值。let表单创建本地绑定,然后可以根据需要设置值

(let(bar baz)
(如果是foo
(设定值1)
baz(2)
(设定值3)
baz(4))
...)
(defmacro plet (vars-vals &rest forms)
  `(apply (lambda ,(car vars-vals)
            ,@forms)
          ,(cadr vars-vals)))
(plet ((bar baz) (if foo '(1 2) '(3 4)))
  ...)