LINUX.ORG.RU

CLOS McCLIM и неизвестное

 


0

1

Здравсвуйте,

Всё не могу понять зачем мне это надо, но Lisp просто под кожу залез, а тут ещё McCLIM. И вот здесь никак не могу понять, что я не могу понять, например

;;;;====McCLIM Guided Tour===========
(in-package :common-lisp-user)

(defpackage "HELLO"
(:use :clim :clim-lisp)
(:export "HELLO-MAIN"))

(in-package :hello)

(define-application-frame hello-world ()
  ((greeting :initform "Hello World"
	     :accessor greeting))
  (:pane (make-pane 'hello-world-pane :width 200 :height 50))) 
                                  ;;; ^ never miss it
(defclass hello-world-pane
  (clim-stream-pane) ())

;;; Behavior defined by the Handle Repaint Protocol
(defmethod handle-repaint ((pane hello-world-pane) region)
  (let ((w (bounding-rectangle-width pane))
	(h (bounding-rectangle-height pane)))
    ;; Blanc the pane out
    (draw-rectangle* pane 0 0 w h
		     :filled t
		     :ink (pane-background pane))
    ;; Draw greeting in center of pane
    (draw-text* pane
		(greeting *application-frame*)
		(floor w 2) (floor h 2)
		:align-x :center
		:align-y :center)))

(defun hello-main ()
(run-frame-top-level
 (make-application-frame 'hello-world)))
а как это работает ни в зуб ногой, хотя знаю что CLOS создаёт листы объектов выбирает наиболее specific то же самое делает с методами. Но чего-то не хватает чтобы что-то поймать в голове и разобрать как этот код работает так как привык, определять функции потом их вызвать в одном месте и получить результат, а сдесь как живой организм с генетическими причудами.

Ltk тоже написан на CLOS и тоже самое. Код уже вывесил.https://www.linux.org.ru/forum/development/14694129

И вот здесь никак не могу понять, что я не могу понять

В чём суть вопроса? Здесь также определил функции. А потом они все вызываются функцией make-application-frame.

То есть, make-application-frame вызывает код, отрисовывающий то, что ты описал в define-application-frame. В данном случае, панель hello-world-pane. Для панели при отрисовке вызывается handle-repaint, которая выводит прямоугольник и текст.

monk ★★★★★
()
Ответ на: комментарий от monk

А вот там я и здох, не всё укладывается в голове. Если не в напряг. Можешь этот код перелложить на McCLIM


(defun string-to-number (n)
  (car (list (read-from-string n))))

(defun sum (a b)
  (+ (string-to-number a) (string-to-number b)))

(defvar s)
(setq s 0)

(defun ltksum()
  (with-ltk ()
    (let* ((bar (make-instance 'frame))
	   #-:tk84
	   (e1 (make-instance 'entry :master bar))
	   (e2 (make-instance 'entry :master bar))
	   (b4 (make-instance 'button
			      :master bar
			      :text "Sum"
			      :command (lambda ()
					 (setf s (sum (text e1) (text e2))))))
	   (l (make-instance 'label
			     :master bar
			     :text s)))
(pack bar)
(pack e1 :side :left)
(pack e2 :side :left)
(pack b4 :side :left)
(pack l :side :left)
)))

Просто где-то видел код на С где-то в 50 строк и тоже «Hello world»

saufesma
() автор топика
Ответ на: комментарий от saufesma

Очень приблизительно (тестировать негде, опыта в McCLIM почти нет).

Будет что-то вроде

;; ... до (defun ltksum() без изменеий

(define-application-frame ltksum ()
  ()
  (:panes 
    (e1 :text-field)
    (e2 :text-field)
    (b4 (make-pane 'push-button
	     :label "Sum"
	     :activate-callback (lambda (btn)
			(setf s (sum (text e1) (text e2)))))
    (l :text-field :value s))
  (:layouts
   (default
     (vertically e1 e2 b4 l))))

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.