선택적 매개 변수 기본값


26

Emacs Lisp는 선택적 매개 변수가 아닌 기본값이 아닌 구문을 지원하지 않습니다. 이러한 매개 변수를 제공하기 위해 권장되는 관용구는 무엇입니까?

내 요점을 명확히하기 위해 여기에 지나치게 명시적인 방법이 있습니다.

(defun command (a &optional supplied-b)
  (let ((b (or supplied-b default-b)))
    (command-body a b)))

권장되는 스타일은 무엇입니까?

답변:


24

@legoscia에서 제안한대로 Common Lisp 확장을 사용하지 않는 한 선택적 인수가 지정되었는지 확인해야합니다. 실제로 let여기 를 사용할 필요는 없습니다 . 이것은 나에게 더 관용적 인 것 같습니다.

(defun command (a &optional b)
  (or b (setq b default))
  (command-body a b))

의견에서 제안한 바와 같이 다음을 사용 unless하는 것이 좋습니다 or.

(defun command (a &optional b)
  (unless b (setq b default))
  (command-body a b))

또한 주석에서 : let원래 질문에서와 같이 보다 순수한 기능적 스타일을 사용하는 것이 좋지만 별도의 변수 이름이 필요하지 않습니다.

(defun my-command (a &optional b)
  (let ((b (or b default)))
    (command-body a b)))

물론 선택적 매개 변수가 한 번만 필요한 경우 다음을 수행해야합니다.

(defun my-command (a &optional b)
    (command-body a (or b default)))

7
-1 :와 같은 setq“순수한”부울 형식과 같은 부작용을 사용하는 것이 좋은 스타일이라고 생각하지 않습니다 or. 제 생각 when에는 여기에 확실히 더 적절하지만 일반적으로 let로컬 바인딩을 설정하거나 변경하기위한 선택의 표현입니다. IOW, 원래 코드는 훨씬 나아 보인다.
lunaryorn

3
나는 같은 (unless b (setq b default)것이 더 좋을 것이라는 데 동의합니다 . 개인적으로, 나는 이미 로컬에 let있기 때문에 여기서 중복되는 것으로 생각 b합니다 defun.
glucas

3
그것은 맛의 문제이지만 순수한 코드와 순수한 바인딩을 선호합니다 (예 : let과 같은 부작용) setq. 매개 변수 기본값의 코드이지만 setq지역 변수를 변경하기 위해 자유로이 사용 하면 코드를 읽고 따르기가 어렵습니다. 모든 로컬 바인딩을 변경할 수없는 것으로 간주하고와 함께 새로운 바인딩을 설정하는 것이 가장 좋습니다 let. IOW, 명령형보다 기능적 스타일을 선호합니다.
lunaryorn

22

cl-defun옵션 인수의 기본값을 지정할 수있는을 사용할 수 있습니다 .

(cl-defun command (a &optional (b default-b))
  (command-body a b))

이 경우 기본값 default-b은 함수가 호출 될 때마다 평가됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.