История изменений
Исправление 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))