Soegaard ответ правильный - это традиционное расширение. Тем не менее, drscheme умен!
Следующий код, который я нашел эквивалентным во время выполнения:
Оригинальный источник:
(define ((substitute lv value) e)
(cond [(LogicVar? e)
(type-case LogicVar e
[lv-any (id) (if (symbol=? id (lv-any-id lv))
value
e)]
[lv-cons (f r)
(lv-cons ((substitute lv value) f)
((substitute lv value) r))])]
[(cons? e)
(cons ((substitute lv value) (car e))
((substitute lv value) (cdr e)))]
[else e]))
Попытка при оптимизации:
(define (substitute lv value)
(local ([define inner
(lambda (e)
(cond [(LogicVar? e)
(type-case LogicVar e
[lv-any (id) (if (symbol=? id (lv-any-id lv))
value
e)]
[lv-cons (f r)
(lv-cons (inner f)
(inner r))])]
[(cons? e)
(cons (inner (car e))
(inner (cdr e)))]
[else e]))])
inner))
Код, который интенсивно использует эту функцию (несколько раз, а не один раз), выполняется в 1800 мс для обеих версий. Еще интереснее эта версия (моя визуализация происходящего):
(define (substitute lv value)
(local ([define inner
(lambda (e)
(cond [(LogicVar? e)
(type-case LogicVar e
[lv-any (id) (if (symbol=? id (lv-any-id lv))
value
e)]
[lv-cons (f r)
(lv-cons ((substitute lv value) f)
((substitute lv value) r))])]
[(cons? e)
(cons ((substitute lv value) (car e))
((substitute lv value) (cdr e)))]
[else e]))])
inner))
Работает при 2000 мс. Таким образом, определенно наблюдается замедление, если бы каждый вызов для замены внутри замены создавал лямбду, но, похоже, это не относится к сокращенной записи.