답변:
@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, 원래 코드는 훨씬 나아 보인다.