Различают & необязательный аргумент со значением по умолчанию от значения

Согласно функциям на GigaMonkeys, Common Lisp поддерживает необязательные позиционные параметры через &optional и значение по умолчанию может быть установлено произвольно.

Значением по умолчанию является nil,

(defun function (mandatory-argument &optional optional-argument) ... )

и значение по умолчанию может быть установлено произвольно

(defun function (mandatory-argument &optional (optional-argument "")) ....)

Есть ли способ отличить случаи, когда необязательный параметр имеет значение по умолчанию, явно переданное в против значения вообще?

РЕДАКТИРОВАТЬ: очевидно, страница, на которую я ссылался, объясняет это.

Время от времени полезно знать, было ли значение необязательного аргумента предоставлено вызывающей стороной или является значением по умолчанию. Вместо того, чтобы писать код, чтобы проверить, является ли значение параметра значением по умолчанию (которое все равно не работает, если вызывающая сторона явно передает значение по умолчанию), вы можете добавить другое имя переменной в спецификатор параметра после значения по умолчанию выражение. Эта переменная будет привязана к true, если вызывающая сторона фактически предоставила аргумент для этого параметра, а в противном случае - NIL. По соглашению эти переменные обычно называются так же, как и фактический параметр с "-supplied-p" в конце. Например:

(defun foo (a b &optional (c 3 c-supplied-p)) 
    (list a b c c-supplied-p))

1 ответ

Решение

Согласно спецификации, вы можете добавить другое имя переменной после необязательного аргумента. Эта переменная будет связана с t если указан необязательный параметр, и nil иначе.

Например:

CL-USER> (defun foo (mandatory &optional (optional1 nil optional1-supplied-p))
           (if optional1-supplied-p
               optional1
               mandatory))

FOO
CL-USER> (foo 3 4)
4
CL-USER> (foo 3)
3
CL-USER> (foo 3 nil)
NIL

В первом случае указывается необязательный параметр, чтобы он создавался как результат функции.

Во втором случае необязательный параметр не указан, а результатом является первый параметр.

В последнем случае, даже если значение необязательного параметра равно значению по умолчанию, функция может различить, что параметр действительно указан, и может вернуть это значение.

Другие вопросы по тегам