
Test1 эквивалентен
(define (test3 x)
(* x x))
В test2 у вас слишком много лямбды.
(define (func-name argument)
body))
Это определяет Переменнаяfunc-name как функцию, которая принимает один аргумент с body в качестве содержимого функции. Это сокращение от:
(define func-name (lambda (argument)
body)
Таким образом, ваш второй пример можно записать так:
(define test2
(lambda (x)
(lambda (x) (* x x))))
test2 - это функция который возвращает функцию. Кроме того, поскольку в обоих случаях используется x, внутренняя функция никогда не будет иметь доступа к аргументу. Представьте себе вместо этого:
(define (make-less-than value)
(lambda (arg)
(< arg value))
(filter (make-less-than 10) '(9 10 1 11 4 19))
; ==> (9 1 4)
Итак, make-less-than возвращает функцию, которая проверяет, меньше ли переданный аргумент, чем value, в данном случае 10. Его можно повторно использовать для других значений. Всего один раз вы могли бы с таким же успехом написать:
(filter (lambda (v) (< v 10)) '(9 10 1 11 4 19))