LINUX.ORG.RU

Не могу разобраться с emacs widget

 ,


0

1

Перелопатил widget example и widget-demo.el, в последнем оказались ошибки которые нужно исправлять, а я не понимаю как эти видгеты определять, если требуется выход за рамки widget example, не то, что ошибки исправлять, ситуация из рук вон плохо. На форуме тоже ничего не нашёл.

Мне нужно объяснение как создавать новые видгеты. И желательно знающего -> незнающему.

Подробнее что у вас не выходит? Если просто: буфер(далее форма) заполняется виджетами сверху вниз:

(widget-insert...)

вставляет текст на форму

(widget-create ...)

создает виджиты и размещает их на форме (тут могу ошибаться, не проверял, но похоже по местоположению курсора)

(widget-create ...)

возвращает объет виджит

(setq w (widget-create ...))

тут к w можно будет потом обратится.

Заканчивается форма

(use-local-map widget-keymap) 
(widget-setup)

Два важных свойства: :notify - сюда запихивается lambda реакции на события виджета, :doc - здесь можно дать комментарий к виджиту (зачем это надо, если не городить глобальные переменные и не присваивать их - то так можно распознать виджет). Как считать форму:

 (goto-char (point-min))
  (while (/= (point) (point-max))
    (widget-forward 1)
    (let ((doc (widget-docstring (widget-at)))
	  (value (widget-value (widget-at))))
      (cond ((string= doc "...")
	     ...)...))
    (end-of-line))
Silerus ★★★★
()
Ответ на: комментарий от Silerus
(require 'widget)
     
     (eval-when-compile
       (require 'wid-edit))
     
     (defvar widget-example-repeat)

(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")
  
  (defun define-widget (X 'editable-field nil &rest nil))
  (widget-create 'X)
  ;;(apply #\\='widget-create CLASS ARGS)
                      ;;:size 2
                      ;;:format "X: %v " ; Text after the field!
                      
  
  (defun define-widget (Y 'editable-field nil &rest nil))
  (widget-create 'Y)
                     ;; :size 2
                      ;;:format "Y: %v " ; Text after the field!
                     ;; )
   (setq a (widget-value X))
   (setq b (widget-value Y))
   (defun sum (a b)
     (+ a b))
    (widget-create 'push-button
                      :notify (lambda (&rest ignore)
                                (sum a b))
                      "Run")
       (widget-insert "\n")
       (use-local-map widget-keymap)
       (widget-setup))

Вот так боролся, не понимая досканально, что к чему.

(widget-create ...)
создает виджиты и размещает их на форме (тут могу ошибаться, не проверял, но >похоже по местоположению курсора)

(widget-create ...)
возвращает объет виджит

Т.е. (widget-create ...) надо вызывать два раза. Я правильно понимаю.

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

Вот такое вышло чудо после некоторых раздумий.

(require 'widget)
     
     (eval-when-compile
       (require 'wid-edit))
     
(defvar X)
(defvar Y)
(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")
  
       (setq X (widget-create 'editable-field
				:size 6
				:value "0"
				:format "Name: %v " ; Text after the field!
				:notify (lambda (widget &rest ignore)
					  (widget-value widget)
					  (widget-setup))
                      ))
  
(setq Y (widget-create 'editable-field
				:size 6
				:value "0"
				:format "Name: %v " ; Text after the field!
				;пишу здесь widget а, что это не знаю
				:notify (lambda (widget &rest ignore)
					  (widget-value widget)
					  (widget-setup))
                      ))
       
   (setq a (string-to-number (widget-value X)))
(setq b (string-to-number (widget-value Y)))

   (defun sum (a b)
     (+ a b))
    (widget-create 'push-button
                      :notify (lambda (widget &rest ignore)
                                (sum a b))
                      "Run")
;здесь надо вывести результат, а как пока не знаю
       (widget-insert "\n")
       (use-local-map widget-keymap)
       (widget-setup))

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

я бы решил эту задачу вот так вот:

(defun widget-sum(Elements Summ)
  (interactive)
  (switch-to-buffer "*Widget Summation*")
  (goto-char (point-min))
  (kill-all-local-variables)
  (let ((inhibit-read-only t))
    (erase-buffer))
  (remove-overlays)
  (widget-create 'editable-list
		 :entry-format "%i %d %v\n"
		 :doc "SummElemets"
		 :value Elements
		 '(editable-field  :value "0" :size 50 :doc "Element"))
  (widget-insert "\n")
  (widget-create 'editable-field
		 :size 50
		 :format "Summa:\t%v"
		 :doc "result"
		 :value Summ
		 )
  (widget-create 'push-button
		 :notify (lambda (&rest ignore) (Resumm))
		 :doc "Resumm"
		 "Re summ")
(widget-insert "\n")
  (use-local-map widget-keymap)   
  (widget-setup))
(defun Resumm()
  (goto-char (point-min))
  (let ((summa 0)
	(Elements))
  (while (< (point) (point-max))
    (widget-forward 1)
    (let ((doc (widget-docstring (widget-at)))
	  (value (widget-value (widget-at))))
      (cond ((string= doc "Element") (push value Elements))
	    ((string= doc "Resumm") (goto-char (point-max))))))
  (mapc (lambda (el) (setq summa (+ summa (string-to-number el)))) Elements)
  (widget-sum (reverse Elements) (number-to-string summa))))

(defun StartSum()
  (interactive)
  (widget-sum '("0") "0"))

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

Ваш код класс. Я на такое не способен.

ВООБЩЕ я задумывал как табличку в одни ячейки ввёл из других получил результаты.

(require 'widget)
     
     (eval-when-compile
       (require 'wid-edit))
     
(defvar X)
(defvar Y)
(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")
  
       (setq X (widget-create 'editable-field
				:size 6
				:value "0"
				:format "Name: %v " ; Text after the field!
				:notify (lambda (&rest ':value)
					  (widget-value-set ':value)
					  (widget-setup))
                      ))Name: 2345        
  
(setq Y (widget-create 'editable-field
				:size 6
				:value "0"
				:format "Name: %v " ; Text after the field!
				;пишу здесь widget а, что это не знаю
				:notify (lambda (&rest ':value)
					  (widget-value-set ':value)
					  (widget-setup))
				))Name: 345         

       
   (setq a (string-to-number (widget-value X)));;сейчас здесь ввидно изменения
(setq b (string-to-number (widget-value Y)));;а вот вывести в третье поле не
;; могу

   (defun sum (a b)
     (+ a b))

(setq Z (widget-create 'editable-field
	       :size 6
	       :value "0"
	       :format "Result: %v"
	       :notify (lambda (widget &rest ':value)
			 (widget-value-set ':value))
			 (widget-setup)))Result: 0 

    (widget-create 'push-button
                      :notify (lambda (&rest Z)
                                (widget-value-set Z))
                      "Run")

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

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

В widget мне непонятно как это реализовано, где окружение переменных таких как value например, откуда я смогу дотянутся до оного.

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

Так, есть функции (widget-value «widget») - она возвращает значение, есть (widget-docstring «widget») - она возвращает значение поля doc, посмотрим пример: (widget-get widget ’:example-length) - забрать начение поля :example-length текущего виджета, (widget-put widget ’:example-length new) - записать значение в поле виджета. (widget-forward n) - переместится к виджиту на n позиций (при n=1 - это следующий) при этом если мы дойдем до края он вернется на первый и остановится, тоже самое с (widget-backword) - только в обратном порядке, (widget-at) - возвращает виджет на котором находится курсор.

Теперь почему я не использую глобальные переменные с widget и вообще стараюсь их использовать по меньше: - фантазия не безгранична, и когда проект разрастается - то начинаешь путаться в глобальных переменных и они начинают перекрывать друг друга (это или опечатка в имени переменной приводит к долгому поиску ошибки, тут спасает байт компиляция), - и потому следуют использовать let для создания локальных переменных. В моем варианте логика простая:

  • Запустить форму с входными данными
  • Ждать нажатия клавиши
  • Используя (widget-forward) (widget-at) пробежать по всем виджета и снять данные
  • Рассчитать полученные данные (в моем примере ошибка и можно было эту операцию выполнить прямо в момент чтения, не пришлось бы запускать второй цикл)
  • Запустить форму с новыми данными -вот и все
Silerus ★★★★
()
Ответ на: комментарий от Silerus
(require 'widget)
     
     (eval-when-compile
       (require 'wid-edit))
     
(defvar X)
(defvar Y)
(defvar Z)
(defvar a)
(defvar b)
(defvar R)

(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")
  
       (setq X (widget-create 'editable-field
				:size 6
				:value "0"
				:format "Name: %v " ; Text after the field!
				:notify (lambda (&rest ':value)
					  (widget-value-set ':value)
					  (widget-setup))
                      ))Name: 234       
  
(setq Y (widget-create 'editable-field
				:size 6
				:value "0"
				:format "Name: %v " ; Text after the field!
				;пишу здесь widget а, что это не знаю
				:notify (lambda (&rest ':value)
					  (widget-value-set ':value)
					  (widget-setup))
				))Name: 345       

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

   (defun sum (a b)
         (+ a b))

(setq R (sum a b))

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

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

       (widget-insert "\n")
       (use-local-map widget-keymap)
       (widget-setup))
saufesma
() автор топика
Ответ на: комментарий от saufesma

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

(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 ★★★★
()
Последнее исправление: Silerus (всего исправлений: 2)
Ответ на: комментарий от Silerus
(widget-create 'push-button
                      :notify (lambda (&rest ignore);;здесь ;никаких упоминаний a b, хотя lambda создаёт своё пространство ;;имён
                                (widget-value-set Z (number-to-string (+ a b)))) ;; а тут они видимы у вас, было дело я вместо
;;ignore их лепил
                      "Run") 

Вообще я смотрел на widget как баран на новые ворота, а с вашими объяснениями я начал что-то понимать.

(widget - это наш текущий виджет) здесь передаем текущий виджет в lambda

т.е. виджет уже заложен в lambda или :notify самой реализацией, чтобы программисту было проще писать, так?

:notify (lambda (&rest ignore)

как я понял вместо ignore ставятся переменные, я думал у меня именно такой случай, но ошибся, вопрос в каких случаях писать переменные вместо ignore?

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 2)
Ответ на: комментарий от saufesma

судя из примера, текущий виджет присваивается переменной widget. Насчет а b - Вы их сами создали глобальными (defvar a), я их просто использовал, lambda ничего не создает, а лишние переменные удалил. &rest - это синтаксическая единица - которая говорит интерпретатору что переменная ignore - это список в который будет помещено неопределённое количество элементов, например

(defun func (&rest test)
(message "%s" test))
(defun test_rest()
(interactive)
(func "1" "2")
(func "1" "2" "4" ""))

Есть еще &optional - необязательные аргументы, если вызвать функцию не указав такой аргумент - то ошибки не будет, а значение аргумента будет nil

(defun func1 (&optional test)
(message "%s" test))
(defun test_opt()
(interactive)
(func1 "1")
(func1))

Результат отобразится в буфере Messages

Silerus ★★★★
()
Последнее исправление: Silerus (всего исправлений: 1)
Ответ на: комментарий от Silerus

Ну вот, не зря не закрыл тему.

Вопрос, будут ли конфликты в коде при таком раскладе

(require ’cl)

(require ’widget)

или лучше весь код писать на elisp?

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 1)
Ответ на: комментарий от saufesma

без понятия, но у меня вроде нормально сосуществуют. Я не супер лиспер (новичок зелёный) и таскаю код с stack-overflow и в том числе и функции на cl, иначе башка треснет

Silerus ★★★★
()
Последнее исправление: Silerus (всего исправлений: 1)
Ответ на: комментарий от Silerus

И ещё, в info нчего нет про GNU Emacs Common Lisp Emulation как это вставить и где найти. Нашёл в html формате на gnu.org и похоже, что у меня весь ихний сайт закачивается.

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

У меня код написанный на sbcl, сначала я его написал на elisр, там памяти оказалось недостаточно, поэтому переписал на sbcl, а сейчас ввиду разбора widget его лучше иметь как модуль к имаксу, очень понравилось. Код на 700 строк, а я не программист, без помощи профессионала займет много времени ,тобы разобраться со всеми коллизиями. Вы могли бы найти время на это дело.

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

Все равно самому интересно. Что происходит в push-button.

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

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


(defun widget-sum ()
  (interactive)
  (switch-to-buffer "*Widget Summation*")
  (kill-all-local-variables)
  (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"
	       ))

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

    (widget-create 'push-button
		   :notify (lambda (&rest ignore)
			     (if (= (+ a b) 4)
				 (progn
				 (widget-value-set X "True") 
				 (widget-value-set Z (number-to-string (+ a b))))
			       (progn
                                 (widget-value-set X "False")
				 (widget-value-set Z (number-to-string (+ a b)))
			     )))
		   "Run") ;; грузим файл, зпускаем widget-sum все поля по 0
;; жмём Run, появляется Result 4 Test True, с чего бы это.

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

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

Этот не хочет работать.

Debugger entered--Lisp error: (wrong-number-of-arguments (2 . 2) 3) widget-value-set((editable-field :size 6 :value «0» :format «Result: %v» :field-overlay #<overlay from 55 to 61 in *Widget Summation*> :from #<marker (moves after insertion) at 47 in *Widget Summation*> :to #<marker at 61 in *Widget Summation*>) «4» nil) (progn (widget-value-set X «True») (widget-value-set Z (number-to-string (+ a b)) (next))) (if (= (+ a b) 4) (progn (widget-value-set X «True») (widget-value-set Z (number-to-string (+ a b)) (next))) (progn (widget-value-set X «False») (widget-value-set Z (number-to-string (+ a b))))) (lambda (&rest ignore) (if (= (+ a b) 4) (progn (widget-value-set X «True») (widget-value-set Z (number-to-string (+ a b)) (next))) (progn (widget-value-set X «False») (widget-value-set Z (number-to-string (+ a b))))))((push-button :args nil :value «Run» :notify (lambda (&rest ignore) (if (= (+ a b) 4) (progn (widget-value-set X «True») (widget-value-set Z (number-to-string (+ a b)) (next))) (progn (widget-value-set X «False») (widget-value-set Z (number-to-string (+ a b)))))) :button-overlay #<overlay from 73 to 78 in *Widget Summation*> :from #<marker (moves after insertion) at 73 in *Widget Summation*> :to #<marker at 78 in *Widget Summation*>) (push-button :args nil :value «Run» :notify (lambda (&rest ignore) (if (= (+ a b) 4) (progn (widget-value-set X «True») (widget-value-set Z (number-to-string (+ a b)) (next))) (progn (widget-value-set X «False») (widget-value-set Z (number-to-string (+ a b)))))) :button-overlay #<overlay from 73 to 78 in *Widget Summation*> :from #<marker (moves after insertion) at 73 in *Widget Summation*> :to #<marker at 78 in *Widget Summation*>) (mouse-1 (#<window 3 on *Widget Summation*> 76 (445 . 42) 10266992 nil 76 (55 . 2) nil (5 . 8) (8 . 17)))) widget-apply((push-button :args nil :value «Run» :notify (lambda (&rest ignore) (if (= (+ a b) 4) (progn (widget-value-set X «True») (widget-value-set Z (number-to-string (+ a b)) (next))) (progn (widget-value-set X «False») (widget-value-set Z (number-to-string (+ a b)))))) :button-overlay #<overlay from 73 to 78 in *Widget Summation*> :from #<marker (moves after insertion) at 73 in *Widget Summation*> :to #<marker at 78 in *Widget Summation*>) :notify (push-button :args nil :value «Run» :notify (lambda (&rest ignore) (if (= (+ a b) 4) (progn (widget-value-set X «True») (widget-value-set Z (number-to-string (+ a b)) (next))) (progn (widget-value-set X «False») (widget-value-set Z (number-to-string (+ a b)))))) :button-overlay #<overlay from 73 to 78 in *Widget Summation*> :from #<marker (moves after insertion) at 73 in *Widget Summation*> :to #<marker at 78 in *Widget Summation*>) (mouse-1 (#<window 3 on *Widget Summation*> 76 (445 . 42) 10266992 nil 76 (55 . 2) nil (5 . 8) (8 . 17)))) widget-item-action((push-button :args nil :value «Run» :notify (lambda (&rest ignore) (if (= (+ a b) 4) (progn (widget-value-set X «True») (widget-value-set Z (number-to-string (+ a b)) (next))) (progn (widget-value-set X «False») (widget-value-set Z (number-to-string (+ a b)))))) :button-overlay #<overlay from 73 to 78 in *Widget Summation*> :from #<marker (moves after insertion) at 73 in *Widget Summation*> :to #<marker at 78 in *Widget Summation*>) (mouse-1 (#<window 3 on *Widget Summation*> 76 (445 . 42) 10266992 nil 76 (55 . 2) nil (5 . 8) (8 . 17)))) widget-apply((push-button :args nil :value «Run» :notify (lambda (&rest ignore) (if (= (+ a b) 4) (progn (widget-value-set X «True») (widget-value-set Z (number-to-string (+ a b)) (next))) (progn (widget-value-set X «False») (widget-value-set Z (number-to-string (+ a b)))))) :button-overlay #<overlay from 73 to 78 in *Widget Summation*> :from #<marker (moves after insertion) at 73 in *Widget Summation*> :to #<marker at 78 in *Widget Summation*>) :action (mouse-1 (#<window 3 on *Widget Summation*> 76 (445 . 42) 10266992 nil 76 (55 . 2) nil (5 . 8) (8 . 17)))) widget-apply-action((push-button :args nil :value «Run» :notify (lambda (&rest ignore) (if (= (+ a b) 4) (progn (widget-value-set X «True») (widget-value-set Z (number-to-string (+ a b)) (next))) (progn (widget-value-set X «False») (widget-value-set Z (number-to-string (+ a b)))))) :button-overlay #<overlay from 73 to 78 in *Widget Summation*> :from #<marker (moves after insertion) at 73 in *Widget Summation*> :to #<marker at 78 in *Widget Summation*>) (mouse-1 (#<window 3 on *Widget Summation*> 76 (445 . 42) 10266992 nil 76 (55 . 2) nil (5 . 8) (8 . 17)))) widget-button-click((down-mouse-1 (#<window 3 on *Widget Summation*> 76 (445 . 42) 10266905 nil 76 (55 . 2) nil (5 . 8) (8 . 17)))) funcall-interactively(widget-button-click (down-mouse-1 (#<window 3 on *Widget Summation*> 76 (445 . 42) 10266905 nil 76 (55 . 2) nil (5 . 8) (8 . 17)))) call-interactively(widget-button-click nil nil) command-execute(widget-button-click)

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

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

(defun next ()
  ())


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

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

    (widget-create 'push-button
		   :notify (lambda (&rest ignore)
			     (if (= (+ a b) 4)
				 (progn
				 (widget-value-set X "True") 
				 (widget-value-set Z (number-to-string (+ a b))
						   (next)))
			       (progn
                                 (widget-value-set X "False")
				 (widget-value-set Z (number-to-string (+ a b)))
			     )))
                      "Run") 

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

(next)

(message "I am here!")

progn: Wrong number of arguments: (2 . 2), 3

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 1)
Ответ на: комментарий от Silerus

Со скобками промухал, теперь работает

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

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

(defun next ()
  (message "I am here!"))


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

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

    (widget-create 'push-button
		   :notify (lambda (&rest ignore)
			     (if (= (+ a b) 4)
				 (progn
				 (widget-value-set X "True") 
				 (widget-value-set Z (number-to-string (+ a b)))
						   (next))
			       (progn
                                 (widget-value-set X "False")
				 (widget-value-set Z (number-to-string (+ a b)))
				 
			     )))
                      "Run") 

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

(next)


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

Кнопка со второго третьего раза работает, с таким выхлопом

/: Symbol’s value as variable is void: *n*

widget-before-change: Text is read-only: «Change should be restricted to a single field»

С выравниванием полей не всё гладко, делаю это пробелами.


;;=========Для расчёта геометрии четырёхзвенного механизма==============
  (defvar *L1*)  ;;стойка, мм
  (defvar *L2*)   ;;кривошип, мм
  (defvar *L3*)  ;;шатун, мм
  (defvar *L4*)   ;;коромысло, мм
 ;;=========== Для расчёта угловых скоростей и ускорений================
  (defvar *n*)  ;;скорость вращения, об/мин
  (defvar *R*)  ;;расстояние от оси качания до кончика гребня
  (defvar test-parts)

  (defun next()
    ())
  
  (defun input ()
  (interactive)
  (switch-to-buffer "Исследования четырёхзвенника")
  (kill-all-local-variables)
  (let ((inhibit-read-only t))
    (erase-buffer))
  (remove-overlays)
  (widget-insert "Ввод геометрических данных четырёхзвенника\n\n")

   (widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Стойка (*L1*):                          %v мм"
		 :notify (lambda (widget &rest ignore)
			   (setq *L1*
				 (string-to-number
				  (widget-value widget)))))

   (widget-insert "\n")

   (widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Кривошип (*L2*):                        %v мм"
		 :notify (lambda (widget &rest ignore)
			   (setq *L2*
				 (string-to-number
				  (widget-value widget)))))

    (widget-insert "\n")

   (widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Шатун (*L3*):                           %v мм"
		 :notify (lambda (widget &rest ignore)
			   (setq *L3*
				 (string-to-number
				  (widget-value widget)))))

    (widget-insert "\n")

   (widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Коромысло (*L4*):                       %v мм"
		 :notify (lambda (widget &rest ignore)
			   (setq *L4*
				 (string-to-number
				  (widget-value widget)))))

    (widget-insert "\n")
   
(setq test-parts (widget-create 'editable-field
	       :size 6
	       :value ""
	       :format "(*L2* + *L3*) < (*L1* + *L4*):          %v"
	       ))

(widget-insert "\n\n")

(widget-insert "Ввод динамических данных.\n\n")

(widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Частота вращения:                       %v об/мин"
		 :notify (lambda (widget &rest ignore)
			   (setq *n*
				 (string-to-number
				  (widget-value widget)))))

(widget-insert "\n")

(widget-create 'editable-field
		 :size 6
		 :value "0"
		 :format "Расстояние от оси качания до 
кончика гребня:                         %v мм"
		 :notify (lambda (widget &rest ignore)
			   (setq *R*
				 (string-to-number
				  (widget-value widget)))))

(widget-insert "\n")

 (widget-create 'push-button
		   :notify (lambda (&rest ignore)
			     (if (< (+ *L2* *L3*) (+ *L1* *L4*))
				 (progn
				 (widget-value-set test-parts "Верно") 
				   (next))
			       (progn
                                 (widget-value-set test-parts "Неверно")
				  )))
                      "Поехали")

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

(next)
  
  (defvar *step*) ;;шаг угла поворота, рад
  (defvar *tmp-lst-of-val-PHI2*) 
  (defvar *lst-of-val-PHI2*) ;; Лист углов кривошипа φ2 за один оборот
  (defvar *tmp-val-PHI2*)       ;; угол 0рад в листе отсутсвует
  (defvar *lst-of-angles-tg-PHIs*) ;;лист значений тангенса угла tg(PHIs)
  (defvar *lst-val-PHIs*) ;;Лист значений угла PHIs
  (defvar *lst-of-vector-s*) ;;лист значений вектора s
  (defvar *lst-val-PHI4s*) ;;лист значений PHI4s
  (defvar *lst-val-PHI3s*)  ;;лист значений PHI3s
  (defvar *lst-val-PHI4*)  ;;Лист значений углов PHI4 рад
  (defvar *lst-val-PHI3*)  ;;лист значений углов PHI3 рад
  (defvar *count-max*) ;;счёт листа начинается с 0.
  (defvar *count-min*)
  
  (setq *tmp-lst-of-val-PHI2* nil) 
  (setq *lst-of-val-PHI2* nil);; Лист углов кривошипа φ2 за один оборот
  (setq *tmp-val-PHI2* 0.0)       ;; угол 0рад в листе отсутсвует
  (setq *lst-of-angles-tg-PHIs* nil) ;;лист значений тангенса угла tg(PHIs)
  (setq *lst-val-PHIs* nil) ;;Лист значений угла PHIs
  (setq *lst-of-vector-s* nil) ;;лист значений вектора s
  (setq *lst-val-PHI4s* nil) ;;лист значений PHI4s
  (setq *lst-val-PHI3s* nil)  ;;лист значений PHI3s
  (setq *lst-val-PHI4* nil)  ;;Лист значений углов PHI4 рад
  (setq *lst-val-PHI3* nil)  ;;лист значений углов PHI3 рад
  (setq *count-max* 0) ;;счёт листа начинается с 0.
  (setq *count-min* 0)
  (setq *step* (/ 6.28318530717954 180));;шаг угла поворота, рад
  ;;;============ввод данных=======================

(defun make-lst-of-val-PHI2 (tmp-val-PHI2 step tmp-lst-of-val-PHI2)
(if (< tmp-val-PHI2 6.28318530717954)
(make-lst-of-val-PHI2 (setq tmp-val-PHI2 (+ tmp-val-PHI2 step))
                            step
                                (push tmp-val-PHI2 tmp-lst-of-val-PHI2))
    tmp-lst-of-val-PHI2))

(setq *lst-of-val-PHI2* 
    (make-lst-of-val-PHI2 *tmp-val-PHI2* *step* *tmp-lst-of-val-PHI2*))
      ;;=========== Для расчёта угловых скоростей и ускорений================
		  
	      (defvar *time*)
	      (defvar *omega2*) ;;угловая частота, 1/c
	      (defvar *epsilon2*)  ;;угловое ускорение, 1/c^2
	      (defvar *PHI2-PHI3-lst*)
	      (defvar *PHI4-PHI3-lst*)
	      (defvar *PHI2-PHI4-lst*)
	      (defvar *PHI3-PHI4-lst*)
	      (defvar *u42-lst*)
	      (defvar *u32-lst*)
	      (defvar *u+42-lst*)
	      (defvar *u+32-lst*)
	      (defvar *true-omega3-lst*)
	      (defvar *true-omega4-lst*)
	      (defvar *true-epsilon3-lst*)
	      (defvar *true-epsilon4-lst*)
	      
	      (setq *PHI2-PHI3-lst* nil)
	      (setq *PHI4-PHI3-lst* nil)
	      (setq *PHI2-PHI4-lst* nil)
	      (setq *PHI3-PHI4-lst* nil)
	      (setq *u42-lst* nil)
	      (setq *u32-lst* nil)
	      (setq *u+42-lst* nil)
	      (setq *u+32-lst* nil)
	      (setq *true-omega3-lst* nil)
	      (setq *true-omega4-lst* nil)
	      (setq *true-epsilon3-lst* nil)
	      (setq *true-epsilon4-lst* nil)
	      (setq *omega2* (/ (* 3.1415926536 *n*) 30)) ;;угловая частота, 1/c
	   
*lst-of-val-PHI2* ;; запустив код не знаю как этот лист посмотреть 

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 3)
Ответ на: комментарий от Silerus

Вот этот кусок кода не совсем то что надо

(defun make-lst-of-val-PHI2 (tmp-val-PHI2 step tmp-lst-of-val-PHI2)
(if (< tmp-val-PHI2 6.28318530717954)
(make-lst-of-val-PHI2 (setq tmp-val-PHI2 (+ tmp-val-PHI2 step))
                            step
                                (push tmp-val-PHI2 tmp-lst-of-val-PHI2))
    tmp-lst-of-val-PHI2))

(setq *lst-of-val-PHI2* 
    (make-lst-of-val-PHI2 *tmp-val-PHI2* *step* *tmp-lst-of-val-PHI2*))

make-lst-of-val-PHI2 (6.318091892219411 6.283185307179525 6.248278722139639 6.213372137099753 6.178465552059866 6.14355896701998 6.108652381980094 6.073745796940208 6.038839211900322 6.003932626860435 5.969026041820549 5.934119456780663 ...)

6.318091892219411 эта цифра в листе не нужна.

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

Выздоравливайте, буду за вас пальцы скрещенными держать. А код я довел, сейчас одно место проверить.w idget вещь, много удобства принесла, очень нравится.

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

Через буфер пробовал, у меня такие вводные Длина стойки Длина кривошипа Длина шатуна Длина коромысла Число оборотов Разбивка окружности А затем кишка вывода, а это только часть задачи, и если в другой части что то не срослось, мне весь этот ввод надо заново вводить с изменением длины чего то, оборотов. В libreoffice программку написать не смог, а имакс выручил.

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

Как я понимаю, вы умудряетесь зарабатывать на хлеб, продовая программки для имакса, для меня это невероятно.

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

Как на имаксе проверить, сколько памяти жрёт программка? В связи с развитием моего творения это стало интересно.

max-specpdl-size установил в 10000 только после этого моё творение заработало, теперь переживаю если ещё чего добавлю у меня что нибудь свалиться, а я неверные цифирки в дальнейшие расчёты закину.

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

я не elisp программист - я пользователь emacs, которому не хватает плагинов, что есть в elpa и melpa, приходится писать себе самому

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