2016-11-13 5 views
0

하나의 조건에 따라 barbaz의 값을 설정하려고한다고 가정합니다. 두 경우 모두 같습니다 (예 : foo). let 특별한 양식을 사용하여, 위 프로그램이 올바른 동안 두 번 foo의 값을 확인으로이elisp의 한 조건에 따라 여러 변수를 설정하는 방법은 무엇입니까?

(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

당신은 이맥스에 대한 cl-lib.el에서 제공하는 여러 값의 커먼 리스프 확장을 사용할 수 있습니다

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

당신은 별도의 기능에 두 경우 모두를 추출 할 수 있습니다. 여기서 당신이 할 수 분명히 좋은 경우에 할 필요는 있지만,

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

이것은 일반적으로 consy입니다 : 내가 elisp에서 (NO 여러 값)를 생각할 수

1

유일한 대답은이 같은 다소 무서운 일이다 리터럴 목록을 제공하십시오.

당신은 이것을 매크로로 감쌀 수 있습니다 : 다음은 필사적으로 약간의 에러 검사가 필요합니다. (elisp은 이것보다 더 많은 시간을 쓰기를 원한다면 너무 성가신 일입니다 - 적어도 backquote 지금).

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

그리고 당신의 표현은 당신은하자 양식 자체의 값을 설정할 필요가 없습니다

(plet ((bar baz) (if foo '(1 2) '(3 4))) 
    ...)