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))

    В комментариях предложили, что unless может быть предпочтительнее or:

      (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. Как случайно выбирать варианты enum в GDScript на Godot 3.3, не перечисляя их?

    Вот объявление enum, которое я использую в GDScript: Хочу случайно выбирать вариант enum, не перечисляя все возможные вариант…

    Ответы 2Последняя активность gdscript
  2. Синтаксис остатка в Nim

    Как в Nim записать операцию взятия остатка? cell % 7 == 0 выдаёт undeclared identifier: '%' Ни поиск в Google, ни просмотр SO…

    Ответы 2Последняя активность nim
  3. Возврат результата из функции APL

    Как сделать так, чтобы моя функция возвращала значение после завершения выполнения? Например, у меня есть: ROUTINE N ? N ⍴ 12…

    Ответы 2Последняя активность apl