Почему использование #' с лямбдой?

Чтобы получить записи из За последние 24 часа вы можете использовать:

from datetime import datetime, timedelta

Entry.objects.filter(pub_date__gte = datetime.now() - timedelta(days=1)) 
13
задан Drew 6 October 2013 в 05:37
поделиться

2 ответа

# ' - это сокращение для функции , которая возвращает указатель на функцию (вместо ее применения). лямбда возвращает функцию, и обычно требуется указатель на эту функцию. Так как это очень распространено, существует также макрос (в пространстве переменных), который делает это за вас, который также называется лямбда . Обе строки кода идентичны.

Что лучше, сводится к спору о Lisp-1 / Lisp-2 : в Common Lisp вы можете делать то и другое благодаря макросу. Как всегда, будьте последовательны.

11
ответ дан 1 December 2019 в 21:38
поделиться

Он отличается в разных диалектах Лиспа. Далее используется Common Lisp:

First # '- это сокращенное обозначение для (function ...) . Таким образом, следующие отличаются только текстуально, но Common Lisp читает их как одно и то же:

#'(lambda (x) (* x 2))

и

(function (lambda (x) (* x 2)))

# 'является макросом чтения и преобразуется, когда код Lisp читается системой Lisp.

Если Lisp вычисляет

(function (lambda (x) (* x 2)))

] Lisp-система создает объект функции, и FUNCTION возвращает его как свое значение .

Итак, когда вам нужна функция как значение, вам нужно записать ее вот так. Функция как значение необходима, когда вы хотите передать ее другим функциям в качестве аргумента, когда вы хотите вернуть ее из функции или когда вы хотите сохранить ее в переменной. Примеры:

(map #'(lambda (x) (* x 2)) '(1 2 3))

(defun (y) #'(lambda (x) (* x y)))

(defparameter *twice-fn* #'(lambda (x) (* x 2)))

Что такое (лямбда (x) (* x 2))?

Это две разные вещи в зависимости от контекста.

Лямбда-выражение

Лямбда-выражение может использоваться вместо имени функции:

(function foo)   and    (function (lambda (x) (* x 2)))

и

(foo 17)    and  ((lambda (x) (* x 2)) 17)

Выше два являются допустимым синтаксисом Common Lisp. Там можно напрямую использовать лямбда-выражение.

Обратите внимание, что следующие две формы недопустимы в Common Lisp:

(#'(lambda (x) (* x 2)) 17)   ; illegal in Common Lisp

(function #'(lambda (x) (* x 2)))  ; illegal in Common Lisp

Macro

В процессе стандартизации Common Lisp был добавлен макрос LAMBDA ( это не было частью первого описания CLtL1 Common Lisp). Это позволяет писать немного более короткий код. Пример:

(lambda (x) (* x 2))

В приведенном выше случае LAMBDA - это макрос. Во время расширения макроса он будет расширен до:

(function (lambda (x) (* x 2)))

Помните, что в приведенной выше форме FUNCTION внутренняя лямбда является частью лямбда-выражения, обозначает функцию и не будет расширяться.

Итак, теперь три примера сверху могут можно записать как:

(map (lambda (x) (* x 2)) '(1 2 3))

(defun (y) (lambda (x) (* x y)))

(defparameter *twice-fn* (lambda (x) (* x 2)))

Это немного короче, выглядит немного менее загроможденным и немного более похожим на код схемы. Это просто выглядит немного лучше для программистов, привыкших читать и писать код схемы.

Резюме

a) (function (lambda (x) (* x 2))) - это «истинный» способ написать код, который возвращает функцию как значение.

b) # '(lambda (x) (* x 2)) - это более короткое обозначение вышеупомянутого

c) (lambda (x) (* x 2)) еще короче , но использует макрорасширение для создания формы a).

14
ответ дан 1 December 2019 в 21:38
поделиться