openlang

선택 인자의 기본값

Emacs Lisp에는 선택 인자에 nil 이외의 기본값을 지정하는 문법이 없어요. 이런 인자에 기본값을 줄 때 어떤 관용구를 쓰는 게 좋나요?

무슨 말인지 보여 드리려고 지나치게 명시적으로 구현해 봤어요.

  (defun perform (entry &optional given-extra)
  (let ((extra (or given-extra fallback-extra)))
  (perform-body entry extra)))

보통 권장하는 작성 방식이 있나요?

영어에서 번역원문 보기

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    cl-defun을 쓰면 선택 인자에 기본값 표현식을 지정할 수 있어요:

      (cl-defun perform (entry &optional (extra fallback-extra))
      (perform-body entry extra))

    여기서는 기본값 표현식인 fallback-extra가 함수를 호출할 때마다 평가돼요.

    영어에서 번역원문 보기
  2. 고유 링크

    @tobin이 제안한 Common Lisp 확장을 쓰지 않는다면 선택 인자가 주어졌는지 검사해야 해요. 이 경우에는 사실 let이 필요하지 않아요. 제게는 이쪽이 더 자연스러워 보여요:

      (defun perform (entry &optional extra)
      (or extra (setq extra fallback))
      (perform-body entry extra))

    댓글에서는 or보다 unless가 나을 수 있다는 의견도 나왔어요:

      (defun perform (entry &optional extra)
      (unless extra (setq extra fallback))
      (perform-body entry extra))

    댓글에서 나온 또 다른 얘기로, 좀 더 순수 함수형인 방식은 질문처럼 let을 쓰되 이름을 두 개로 나누지 않는 거예요:

      (defun my-perform (entry &optional extra)
      (let ((extra (or extra fallback)))
      (perform-body entry extra)))

    물론 선택 인자를 한 번만 쓴다면 이렇게 쓰면 돼요:

      (defun my-perform (entry &optional extra)
      (perform-body entry (or extra fallback)))
    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. Godot 3.3의 GDScript에서 일일이 나열하지 않고 enum 항목을 무작위로 고르기?

    GDScript에서 enum을 이렇게 선언했어요: 가능한 모든 변형을 나열하지 않고 enum 변형을 무작위로 고르고 싶어요. 나중에 변형을 더 추가해도 무작위로 선택하는 코드를 수정하지 않도록요. 이런 방법을 시도해 봤어요:…

    답글 2최근 활동 gdscript
  2. Nim 나머지 연산 문법

    Nim에서는 나머지를 어떻게 표현하나요? cell % 7 == 0를 쓰면 undeclared identifier: '%'가 나옵니다 Google로 검색해도 SO를 찾아봐도 답을 찾지 못했습니다.

    답글 2최근 활동 nim
  3. APL 함수에서 결과 반환하기

    함수 실행이 끝나면 어떤 값을 반환하게 하려면 어떻게 하나요? 예를 들어 이런 것이 있습니다: ROUTINE N ? N ⍴ 12 //이것은 1부터 12까지의 난수 N개를 만듭니다 (N은 함수의 인수입니다). 함수의 결과를 돌…

    답글 2최근 활동 apl