Давным-давно, в далекой галактике, во время курса на Схеме нам давался пример лямбда-игр:
(define (foo x)
(lambda (y) (x (x (x y)))))
Теперь, очевидно, ((foo 1+) 0)
напечатает 3. (1+
- это стандартный оператор инкремента Схемы) Но самое интересное, что вы можете применить foo
к себе, а затем вы можете делать такие забавные вещи, как:
(((foo foo) 1+) 0)
, что, конечно, печатает 27. И затемэто действительно смешно:
(define a (foo foo))
(((a foo) 1+) 0)
Я проделал этот трюк в CommonLisp, Clojure, Ruby, Python, Haskell, Erlang и Julia ...
Так что возникает вопрос, можете ли вы сделать этов Свифт ?Я знаю, что вы можете выполнять функции более высокого порядка, но можете ли вы создать такие функции, которые будут такими же «рефлексивными», как и в чисто функциональных языках?
Tx!