2016-11-13 10 views
0

barbazの値を1つの条件に応じて設定したいとします。両方の場合で同じです(たとえば、fooという値)。上記のプログラムは正しいですが、それは二回fooの値をチェックするようlet特殊な形式を使用して、私は elispの1つの条件に応じて複数の変数を設定する方法は?

このような
(let ((bar (if foo 1 2)) 
     (baz (if foo 3 4))) 
    ...) 

何かを、それは少し奇妙に思えます。そのような場合にダブルチェックを避けるために使用できる慣用表現はありますか?

答えて

1

(リテラルのリストにこの時間を使って)になります。 letフォームはローカルバインディングを作成します。その後、必要に応じて値を設定することができます。

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

あなたは、Emacsためcl-lib.elが提供する複数の値、Common Lispの拡張機能を使用することができます

(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はこれ以上の時間を費やしたくないと思っています - 少なくともbackquote今)。

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

そして、あなたの表現は、あなたはのletフォーム自体に値を設定する必要はありません

(plet ((bar baz) (if foo '(1 2) '(3 4))) 
    ...) 
関連する問題