Pull to refresh

Comments 7

Очень интересно было прочитать о взаимосвязи ФП и ООП. В Scheme такая реализация инкапсуляции красиво выглядит. Вопрос: а в Коммон Лиспе можно такое провернуть?
Написал для 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))'

Да, в Scheme красивее выглядит. Без funcall в Коммон Лиспе не получится так сделать, я правильно понимаю?
Кстати, 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))))
Sign up to leave a comment.

Articles