Изучаю сейчас сабж, и у меня возникли некоторые затруднения. Предположим, передо мной стоит простая задача: реализовать операции добавления числа и умножения на число некой последовательности чисел. Как это грамотно сделать с точки зрения функционального программирования? В sicp предлагается вариант некого подобия ОО, это бы выглядело так: (define make-sequence (lambda (values-list) (lambda (message) (cond ((equal? message 'add) (lambda (number) (make-sequence (map (lambda (value) (+ value number)) values-list)))) ((equal? message 'scale) (lambda (number) (make-sequence (map (lambda (value) (* value number)) values-list)))) (else (display "Wrong message for make-sequence")))))) И потом использование: (define s (make-sequence (list 0 1 2 3))) ((s 'add) 4) ((s 'scale) 2) Но, что-то, меня смущает эта псевдо-диспетчеризация :) А если мне надо будет миллион раз вызвать (s 'add), он ведь будет миллион раз делать cond, хотя я же явно ему указываю, что я хочу. С другой стороны, мне явно надо определять нужные операции внутри make-sequence, чтобы получить замыкание, иначе придется все параметры передавать еще куда-то дальше, а если их не один, а десять, это тоже накладно :( Сходу я придумал такой вариант, с возвращением списка замыканий: (define make-sequence (lambda (values-list) (list (lambda (number) (make-sequence (map (lambda (value) (+ value number)) values-list))) (lambda (number) (make-sequence (map (lambda (value) (* value number)) values-list)))))) (define sequence-add (lambda (sequence number) ((car sequence) number))) (define sequence-scale (lambda (sequence number) ((cadr sequence) number))) И использование: (define s (make-sequence (list 0 1 2 3))) (sequence-add s 4) (sequence-scale s 2) Тут много можно под макросы упаковать, но для наглядности я оставил так. Сразу видны минусы: чтобы выполнить операцию, надо ползти по списку, что тоже должно быть накладно :( Есть какая-нибудь устоявшаяся практика в реализации таких вещей?
Ответ на:
комментарий
от Begemoth
Ответ на:
комментарий
от Begemoth
Ответ на:
комментарий
от swizard
Ответ на:
комментарий
от swizard
Ответ на:
комментарий
от Begemoth
Ответ на:
комментарий
от swizard
Ответ на:
комментарий
от Begemoth
Ответ на:
комментарий
от swizard
Ответ на:
комментарий
от swizard
Ответ на:
комментарий
от Begemoth
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Почему в scheme не любят set! ? (2014)
- Форум Получить список из листьев дерева (scheme) (2006)
- Форум [Scheme][Lisp][Макры] Есть вопросы. (2010)
- Форум [лисп?] Festival text2wave. Как оно работает? (2009)
- Форум GIMP - Scheme (Script-Fu) - Cохранение слоев в png (2017)
- Форум [lisp]использование compiler-macro (2008)
- Форум mcclim pane options и непонятный element (2019)
- Форум Выясняем с помощью Emacs, какой ЯП лучше (2024)
- Форум сделал неработоспособную конфигурацию Emacs (2017)
- Форум Помогите сделать макрос красивым (2013)