Нет. lambda
Racket создает замыкание, которое не запоминает его S-выражение (или объект синтаксиса). Обычно он запоминает свое имя (или его сокращенное исходное местоположение, если никакое имя не может быть выведено), и этого достаточно, чтобы помочь с отладкой. (См. object-name
.)
Вы можете создать свой собственный вариант lambda
, который имеет эту функцию, используя соответствующие структуры Racket и простой макрос. Вот базовый c пример:
#lang racket
(struct exp-closure (f exp)
#:property prop:procedure (struct-field-index f))
(define-syntax-rule (exp-lambda formals . body)
(exp-closure (lambda formals . body)
(quote (exp-lambda formals . body))))
(let ([my-thunk (exp-lambda () (+ 1 2))])
(printf "fun is ~v\n" my-thunk)
(printf "exp is ~v\n" (exp-closure-exp my-thunk))
(printf "result is ~v\n" (my-thunk)))
Это производит
fun is #<procedure:...tmp/lambda.rkt:11:19>
exp is '(exp-lambda () (+ 1 2))
result is 3
Лучшая версия этого макроса может распространить исходное местоположение макроса на выражение lambda
, которое оно создает, или предполагаемое имя (см. syntax-local-infer-name
), или оба.