Читаю SICP. По первости ломает мозг напрочь. Привык уже к императивным языкам, а тут функциональный, да еще с такой-то теорией.
Очень понравилось адаптировать примеры к моим условиям - можно, конечно, скачать mit-scheme и переписывать все с книги, но гораздо интереснее реализовывать то же самое на, к примеру, elisp'е.
Вчера, к примеру, столкнулся с проблемой. Задача - написать функцию, складывающую первый аргумент с модулем второго, не используя функции модуля. Пример на Scheme:
(define (a-plus-abs-b a b) ((if (> b 0) + -) a b))
Однако в CommonLISP'е и elisp'е такой пример не заработал - не понравилось им выражение (if (> b 0) + -), стоящее на месте, где лисп ожидал увидеть имя функции. В итоге, после размышлений, решил попробовать (пример на elisp):
(defun a-plus-abs-b (a b)
(apply (if (> b 0) '+ '-) (list a b)))
То бишь, применить функцию "+" либо "-" к списку аргументов. Чуть позже подсказали другой способ - используя funcall:
(defun a-plus-abs-b (a b)
(funcall (if (> b 0) '+ '-) a b))
Вот такие дела. Очень рекомендую.
UPD: Честно сказать, то, как это реализовано в Схеме, мне нравится больше: и то, что можно передавать функцию аккурат первым аргументом в список, и синтаксис определения функции - мне он кажется более общим, что ли, более соответствующим идее "все есть список".
UPD: Честно сказать, то, как это реализовано в Схеме, мне нравится больше: и то, что можно передавать функцию аккурат первым аргументом в список, и синтаксис определения функции - мне он кажется более общим, что ли, более соответствующим идее "все есть список".
Комментариев нет:
Отправить комментарий