2016-11-13 62 views
0

假设我想设置barbaz的值,具体取决于一种情况,两种情况都是相同的,比如foo的值。使用let特殊形式,我做这样的事情如何根据elisp中的一个条件设置一堆变量?

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

虽然上面的程序是正确的,这似乎有些奇怪,因为它会检查foo值的两倍。在这种情况下可以使用一种习惯用语来避免复查吗?

回答

1

你不必在咱们形式本身设置的值。 let表单创建本地绑定,然后您可以根据需要设置值。

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

您可以使用cl-lib.el提供的多个值,则Common Lisp的扩展Emacs的

(multiple-value-bind (bar baz) 
    (if foo (values 1 3) (values 2 4)) 
    ...) 

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

1

我能想到的elisp的(没有多个值)的唯一的答案是什么,而可怕的是这样的:

(apply (lambda (bar baz) 
     ...) 
     (if foo 
      (list 1 2) 
     (list 3 4))) 

这是consy一般,但是,显然不一定是在良好的情况下,你可以提供文字列表。

你可以在宏把这个包:以下是这样的,虽然它迫切需要的一些错误检查(elisp的是太讨厌写我想花更多的时间比这一点 - 至少它有反引号现在)。

(defmacro plet (vars-vals &rest forms) 
    `(apply (lambda ,(car vars-vals) 
      ,@forms) 
      ,(cadr vars-vals))) 

然后你的表情会成为(使用文字列表这个时候)

(plet ((bar baz) (if foo '(1 2) '(3 4))) 
    ...) 
相关问题