Обо мне

Моя фотография
Дикий Полярный Сов

пятница, 12 февраля 2010 г.

SICP


Читаю 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: Честно сказать, то, как это реализовано в Схеме, мне нравится больше: и то, что можно передавать функцию аккурат первым аргументом в список, и синтаксис определения функции - мне он кажется более общим, что ли, более соответствующим идее "все есть список".

Комментариев нет:

Отправить комментарий