답변:
@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)))
(unless b (setq b default)것이 더 좋을 것이라는 데 동의합니다 . 개인적으로, 나는 이미 로컬에 let있기 때문에 여기서 중복되는 것으로 생각 b합니다 defun.
let과 같은 부작용) setq. 매개 변수 기본값의 코드이지만 setq지역 변수를 변경하기 위해 자유로이 사용 하면 코드를 읽고 따르기가 어렵습니다. 모든 로컬 바인딩을 변경할 수없는 것으로 간주하고와 함께 새로운 바인딩을 설정하는 것이 가장 좋습니다 let. IOW, 명령형보다 기능적 스타일을 선호합니다.
setq“순수한”부울 형식과 같은 부작용을 사용하는 것이 좋은 스타일이라고 생각하지 않습니다or. 제 생각when에는 여기에 확실히 더 적절하지만 일반적으로let로컬 바인딩을 설정하거나 변경하기위한 선택의 표현입니다. IOW, 원래 코드는 훨씬 나아 보인다.