Сообщение Re: Как работает funcall в Лиспе? от 22.07.2024 6:39
Изменено 22.07.2024 6:58 korvin_
Re: Как работает funcall в Лиспе?
Здравствуйте, Worminator X, Вы писали:
WX>Как-то запутанно все... В учебнике Святослава Лаврова, по которому когда-то учил Лисп, funcall совершенно не упоминалась, там говорилось, что выражение (f a1 ... aN) просто применяет значение f (которое должно быть лямбдой) к аругментам a1-aN и выдает результат. И вообще весь Лисп описывался 10 базовыми функциями: car, cdr, cons, atom, eq, cond, lambda, defun, setq и quote.
"вообще весь Лисп описывался 10 базовыми функциями" -- это Lisp 1.5, или типа того, конца 50-х — начала 60-х.
Стандарт Common Lisp вышел в 1994-м году и описывает гораздо более поздний Лисп, который описывается куда большим количеством функций, типов, особых форм и прочего.
WX>простой пример с ООП
Простой пример с ООП на Common Lisp выглядит так:
WX>Как-то запутанно все... В учебнике Святослава Лаврова, по которому когда-то учил Лисп, funcall совершенно не упоминалась, там говорилось, что выражение (f a1 ... aN) просто применяет значение f (которое должно быть лямбдой) к аругментам a1-aN и выдает результат. И вообще весь Лисп описывался 10 базовыми функциями: car, cdr, cons, atom, eq, cond, lambda, defun, setq и quote.
"вообще весь Лисп описывался 10 базовыми функциями" -- это Lisp 1.5, или типа того, конца 50-х — начала 60-х.
Стандарт Common Lisp вышел в 1994-м году и описывает гораздо более поздний Лисп, который описывается куда большим количеством функций, типов, особых форм и прочего.
WX>простой пример с ООП
Простой пример с ООП на Common Lisp выглядит так:
(defvar *user-counter* 0)
(defclass user ()
((id :initform (incf *user-counter*) :reader get-id)
(name :initarg :name :reader get-name)))
(defgeneric data (obj))
(defmethod data ((u user))
(list (get-id u) (get-name u)))
(defgeneric format-object (obj fmt))
(defmethod format-object ((u user) (fmt string))
(format nil fmt (get-id u) (get-name u)))
(print (format-object (make-instance 'user :name "Worminator") "id: ~d, name: ~s"))
Re: Как работает funcall в Лиспе?
Здравствуйте, Worminator X, Вы писали:
WX>Как-то запутанно все... В учебнике Святослава Лаврова, по которому когда-то учил Лисп, funcall совершенно не упоминалась, там говорилось, что выражение (f a1 ... aN) просто применяет значение f (которое должно быть лямбдой) к аругментам a1-aN и выдает результат. И вообще весь Лисп описывался 10 базовыми функциями: car, cdr, cons, atom, eq, cond, lambda, defun, setq и quote.
"вообще весь Лисп описывался 10 базовыми функциями" -- это Lisp 1.5, или типа того, конца 50-х — начала 60-х.
Стандарт Common Lisp вышел в 1994-м году и описывает гораздо более поздний Лисп, который описывается куда большим количеством функций, типов, особых форм и прочего.
WX>простой пример с ООП
Простой пример с ООП на Common Lisp выглядит так:
Или так:
WX>Как-то запутанно все... В учебнике Святослава Лаврова, по которому когда-то учил Лисп, funcall совершенно не упоминалась, там говорилось, что выражение (f a1 ... aN) просто применяет значение f (которое должно быть лямбдой) к аругментам a1-aN и выдает результат. И вообще весь Лисп описывался 10 базовыми функциями: car, cdr, cons, atom, eq, cond, lambda, defun, setq и quote.
"вообще весь Лисп описывался 10 базовыми функциями" -- это Lisp 1.5, или типа того, конца 50-х — начала 60-х.
Стандарт Common Lisp вышел в 1994-м году и описывает гораздо более поздний Лисп, который описывается куда большим количеством функций, типов, особых форм и прочего.
WX>простой пример с ООП
Простой пример с ООП на Common Lisp выглядит так:
(defvar *user-counter* 0)
(defclass user ()
((id :initform (incf *user-counter*) :reader get-id)
(name :initarg :name :reader get-name)))
(defgeneric data (obj))
(defmethod data ((u user))
(list (get-id u) (get-name u)))
(defgeneric format-object (obj fmt))
(defmethod format-object ((u user) (fmt string))
(format nil fmt (get-id u) (get-name u)))
(print (format-object (make-instance 'user :name "Worminator") "id: ~d, name: ~s"))
Или так:
(defclass user ()
((id :reader get-id)
(name :initarg :name :reader get-name)
(counter :initform 0 :allocation :class)))
(defmethod initialize-instance :after ((u user) &rest args)
(setf (slot-value u 'id) (incf (slot-value u 'counter))))
(defgeneric data (obj))
(defmethod data ((u user))
(list (get-id u) (get-name u)))
(defmethod print-object ((u user) out)
(format out "id: ~d, name: ~s" (get-id u) (get-name u)))
(print (make-instance 'user :name "Worminator"))