Информация об изменениях

Сообщение 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 выглядит так:

(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 выглядит так:

(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"))