LINUX.ORG.RU

История изменений

Исправление Silerus, (текущая версия) :

У вас там полно ошибок, пример вообще не рабочий - он просто падает на создание элементов, например вот здесь

(widget-create 'push-button
                      :notify (lambda (&rest Z R)
                                (widget-value-set 'Z 'R)
                      "Run"))[] ;; здесь я ожидал, что :value в Z изменится, 

Лямбда неправильно закрыта, Z R - квотить не надо, зачемто эти квадратные скобочки в конце - но это фигня, вот это:

(setq a (string-to-number (widget-value X)))
(setq b (string-to-number (widget-value Y)))
(setq R (sum a b))

Будет выполнено всего один раз, когда инициализирует ваш файл содержащий код - т.е на все ваши изменения значений функция вообще не срабатывает. Объясните что вы хотели сказать вот этим

:notify (lambda (&rest ':value)
	(widget-value-set ':value)
	(widget-setup))

Вообще бесмысленая операция

А вот так это будет работать, ваш пример с маленькими правками

(require 'widget)
     
     (eval-when-compile
       (require 'wid-edit))
     

(defvar Z)
(defvar a)
(defvar b)


(defun widget-sum ()
  (interactive)
  (switch-to-buffer "*Widget Summation*")
  (kill-all-local-variables)
  (make-local-variable 'widget-example-repeat); без этой строки тоже все будет работать, она не нужна
  (let ((inhibit-read-only t))
    (erase-buffer))
  (remove-overlays)
  (widget-insert "Here is summation.\n\n")
  
  (widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Name: %v " ; Text after the field!
		 :notify (lambda (widget &rest ignore);(widget - это наш текущий виджет) здесь передаем текущий виджет в lambda
			   (setq a (string-to-number (widget-value widget)))))       
  
  (widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Name: %v " ; Text after the field!
					;пишу здесь widget а, что это не знаю
		 :notify (lambda (widget &rest ignore) ;(widget - это наш текущий виджет) здесь передаем текущий виджет в lambda
			   (setq b (string-to-number (widget-value widget)))))      

       


(setq Z (widget-create 'editable-field
	       :size 6
	       :value "0"
	       :format "Result: %v"
	       ))     

    (widget-create 'push-button
                      :notify (lambda (&rest ignore)
                                (widget-value-set Z (number-to-string (+ a b))))
                      "Run") 

       (widget-insert "\n")
       (use-local-map widget-keymap)
       (widget-setup))

а еще можно сделать вот так вот

(require 'widget)
     
     (eval-when-compile
       (require 'wid-edit))
     


(defvar a)
(defvar b)


(defun widget-sum ()
  (interactive)
  (switch-to-buffer "*Widget Summation*")
  (kill-all-local-variables)
  (make-local-variable 'widget-example-repeat)
  (let ((inhibit-read-only t))
    (erase-buffer))
  (remove-overlays)
  (widget-insert "Here is summation.\n\n")
  
  (widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Name: %v " ; Text after the field!
		 :notify (lambda (widget &rest ignore);(widget - это наш текущий виджет) здесь передаем текущий виджет в lambda
			   (setq a (string-to-number (widget-value widget)))))       
  
  (widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Name: %v " ; Text after the field!
					;пишу здесь widget а, что это не знаю
		 :notify (lambda (widget &rest ignore) ;(widget - это наш текущий виджет) здесь передаем текущий виджет в lambda
			   (setq b (string-to-number (widget-value widget)))))      

       


  (widget-create 'editable-field
	       :size 6
	       :value "0"
	       :format "Result: %v")     

    (widget-create 'push-button
		   :notify (lambda (&rest ignore)
			     (widget-backward 1)
			     (widget-value-set (widget-at) (number-to-string (+ a b))))
                      "Run") 

       (widget-insert "\n")
       (use-local-map widget-keymap)
       (widget-setup))

Исправление Silerus, :

У вас там полно ошибок, пример вообще не рабочий - он просто падает на создание элементов, например вот здесь

(widget-create 'push-button
                      :notify (lambda (&rest Z R)
                                (widget-value-set 'Z 'R)
                      "Run"))[] ;; здесь я ожидал, что :value в Z изменится, 

Лямбда неправильно закрыта, Z R - квотить не надо, зачемто эти квадратные скобочки в конце - но это фигня, вот это:

(setq a (string-to-number (widget-value X)))
(setq b (string-to-number (widget-value Y)))
(setq R (sum a b))

Будет выполнено всего один раз, когда инициализирует ваш файл содержащий код - т.е на все ваши изменения значений функция вообще не срабатывает. Объясните что вы хотели сказать вот этим

:notify (lambda (&rest ':value)
	(widget-value-set ':value)
	(widget-setup))

Вообще бесмысленая операция

А вот так это будет работать, ваш пример с маленькими правками

(require 'widget)
     
     (eval-when-compile
       (require 'wid-edit))
     

(defvar Z)
(defvar a)
(defvar b)


(defun widget-sum ()
  (interactive)
  (switch-to-buffer "*Widget Summation*")
  (kill-all-local-variables)
  (make-local-variable 'widget-example-repeat); без этой строки тоже все будет работать, она не нужна
  (let ((inhibit-read-only t))
    (erase-buffer))
  (remove-overlays)
  (widget-insert "Here is summation.\n\n")
  
  (widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Name: %v " ; Text after the field!
		 :notify (lambda (widget &rest ignore);(widget - это наш текущий виджет) здесь передаем текущий виджет в lambda
			   (setq a (string-to-number (widget-value widget)))))       
  
  (widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Name: %v " ; Text after the field!
					;пишу здесь widget а, что это не знаю
		 :notify (lambda (widget &rest ignore) ;(widget - это наш текущий виджет) здесь передаем текущий виджет в lambda
			   (setq b (string-to-number (widget-value widget)))))      

       


(setq Z (widget-create 'editable-field
	       :size 6
	       :value "0"
	       :format "Result: %v"
	       ))     

    (widget-create 'push-button
                      :notify (lambda (&rest ignore)
                                (widget-value-set Z (number-to-string (+ a b))))
                      "Run") 

       (widget-insert "\n")
       (use-local-map widget-keymap)
       (widget-setup))

Исходная версия Silerus, :

У вас там полно ошибок, пример вообще не рабочий - он просто падает на создание элементов, например вот здесь

(widget-create 'push-button
                      :notify (lambda (&rest Z R)
                                (widget-value-set 'Z 'R)
                      "Run"))[] ;; здесь я ожидал, что :value в Z изменится, 

Лямбда неправильно закрыта, Z R - квотить не надо, зачемто эти квадратные скобочки в конце - но это фигня, вот это:

(setq a (string-to-number (widget-value X)))
(setq b (string-to-number (widget-value Y)))
(setq R (sum a b))

Будет выполнено всего один раз, когда инициализирует ваш файл содержащий код - т.е на все ваши изменения значений функция вообще не срабатывает. Объясните что вы хотели сказать вот этим

:notify (lambda (&rest ':value)
	(widget-value-set ':value)
	(widget-setup))

Вообще бесмысленая операция

А вот так это будет работать, ваш пример с маленькими правками

(require 'widget)
     
     (eval-when-compile
       (require 'wid-edit))
     

(defvar Z)
(defvar a)
(defvar b)


(defun widget-sum ()
  (interactive)
  (switch-to-buffer "*Widget Summation*")
  (kill-all-local-variables)
  (make-local-variable 'widget-example-repeat)
  (let ((inhibit-read-only t))
    (erase-buffer))
  (remove-overlays)
  (widget-insert "Here is summation.\n\n")
  
  (widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Name: %v " ; Text after the field!
		 :notify (lambda (widget &rest ignore);(widget - это наш текущий виджет) здесь передаем текущий виджет в lambda
			   (setq a (string-to-number (widget-value widget)))))       
  
  (widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Name: %v " ; Text after the field!
					;пишу здесь widget а, что это не знаю
		 :notify (lambda (widget &rest ignore) ;(widget - это наш текущий виджет) здесь передаем текущий виджет в lambda
			   (setq b (string-to-number (widget-value widget)))))      

       


(setq Z (widget-create 'editable-field
	       :size 6
	       :value "0"
	       :format "Result: %v"
	       ))     

    (widget-create 'push-button
                      :notify (lambda (&rest ignore)
                                (widget-value-set Z (number-to-string (+ a b))))
                      "Run") 

       (widget-insert "\n")
       (use-local-map widget-keymap)
       (widget-setup))