Комментарии 7
Очень интересно было прочитать о взаимосвязи ФП и ООП. В Scheme такая реализация инкапсуляции красиво выглядит. Вопрос: а в Коммон Лиспе можно такое провернуть?
+1
Написал для CLISP в файл prog1.lisp:
Компилируем:
Запускаем:
(defun Object (x1 )
(defvar var1 x1)
(defun get-var1 () var1)
(defun set-var1 (x) (setf var1 x))
(defun dispatch (m)
(cond ((EQ m 'get-var1) (function get-var1))
((EQ m 'set-var1) (function set-var1))
)
)
(function dispatch)
)
(defun main ()
(defparameter Obj1 (Object " Hello world!!! " ))
(format t "get text result:~s~%" (funcall (funcall Obj1 'get-var1)))
(funcall (funcall Obj1 'set-var1) "Hello habra!!!")
(format t "get text result:~s\~%" (funcall (funcall Obj1 'get-var1)))
)
Компилируем:
$ clisp -c prog1.lisp
Запускаем:
$ clisp -q -q -on-error abort -x '(progn (load "prog1") (main) (quit))'
0
Да, в Scheme красивее выглядит. Без funcall в Коммон Лиспе не получится так сделать, я правильно понимаю?
Кстати, defvar и defun определяют переменные и функции глобально. В Вашей программе при создании второго объекта всё перемешается. Нужно поля и методы в лексическом окружении делать через let и labels
Кстати, defvar и defun определяют переменные и функции глобально. В Вашей программе при создании второго объекта всё перемешается. Нужно поля и методы в лексическом окружении делать через let и labels
(defun Object (x1 )
(let ((var1 x1))
(labels ((get-var1 () var1)
(set-var1 (x) (setf var1 x))
(dispatch (m)
(cond ((EQ m 'get-var1) (function get-var1))
((EQ m 'set-var1) (function set-var1)))))
(function dispatch))))
0
В место funcall, можно еще apply использовать. Тут подробности.
0
про let и labels… вы правы
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Объектно ориентированный подход на функциях в Scheme