* How to tame compiler? @ 2021-04-22 14:43 Jean Louis 2021-04-22 14:46 ` Stefan Monnier 2021-05-01 0:44 ` Michael Heerdegen 0 siblings, 2 replies; 72+ messages in thread From: Jean Louis @ 2021-04-22 14:43 UTC (permalink / raw) To: Help GNU Emacs As I have recently implemented new function that use `eval' to expand various variables and these variables are not visibly used in the program, I would like to tame the compiler, as I get these warnings: In rcd-send-email: rcd-mailing.el:225:62: Warning: Unused lexical variable `unsubscribe-url' rcd-mailing.el:231:21: Warning: Unused lexical variable `hello-name' rcd-mailing.el:234:72: Warning: Unused lexical variable `unsubscribe-text' rcd-mailing.el:252:11: Warning: Unused lexical variable `body' What is happening here is that those variables are used but inside of `eval' form which is expanded dynamically when program runs. Compiler cannot see that. Is there a way to avoid these warnings? Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-04-22 14:43 How to tame compiler? Jean Louis @ 2021-04-22 14:46 ` Stefan Monnier 2021-04-22 15:47 ` Jean Louis ` (2 more replies) 2021-05-01 0:44 ` Michael Heerdegen 1 sibling, 3 replies; 72+ messages in thread From: Stefan Monnier @ 2021-04-22 14:46 UTC (permalink / raw) To: help-gnu-emacs > Is there a way to avoid these warnings? Yes: don't abuse `eval` ;-) Stefan ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-04-22 14:46 ` Stefan Monnier @ 2021-04-22 15:47 ` Jean Louis 2021-04-22 16:06 ` Jean Louis 2021-04-30 13:31 ` Jorge P. de Morais Neto 2 siblings, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-04-22 15:47 UTC (permalink / raw) To: Stefan Monnier; +Cc: help-gnu-emacs * Stefan Monnier <monnier@iro.umontreal.ca> [2021-04-22 17:47]: > > Is there a way to avoid these warnings? > > Yes: don't abuse `eval` ;-) I know that legendary saying. In practice there was never any problem. Variables related to page, like title, description, some images, footer, header, some SQL, imaginary real time reports, those things. Of course I could expose this way whole list of passwords on WWW, but it is never going to happen as it is one person who controls the system. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-04-22 14:46 ` Stefan Monnier 2021-04-22 15:47 ` Jean Louis @ 2021-04-22 16:06 ` Jean Louis 2021-04-30 13:31 ` Jorge P. de Morais Neto 2 siblings, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-04-22 16:06 UTC (permalink / raw) To: Stefan Monnier; +Cc: help-gnu-emacs * Stefan Monnier <monnier@iro.umontreal.ca> [2021-04-22 17:47]: > > Is there a way to avoid these warnings? > > Yes: don't abuse `eval` ;-) I found that this works: (ignore "Avoid compiler warnings" to-name hello-name body unsubscribe-text unsubscribe-url) Now I don't get compiler warnings for those variables. But is it the right way? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-04-22 14:46 ` Stefan Monnier 2021-04-22 15:47 ` Jean Louis 2021-04-22 16:06 ` Jean Louis @ 2021-04-30 13:31 ` Jorge P. de Morais Neto 2021-04-30 19:38 ` rcd-template-eval - was " Jean Louis ` (3 more replies) 2 siblings, 4 replies; 72+ messages in thread From: Jorge P. de Morais Neto @ 2021-04-30 13:31 UTC (permalink / raw) To: help-gnu-emacs Hi all! Em [2021-04-22 qui 10:46:59-0400], Stefan Monnier escreveu: >> Is there a way to avoid these warnings? > > Yes: don't abuse `eval` ;-) Jean Louis, could you provide a little more detail on what are you using ~eval~ for? Some tasks accomplished by eval can be done more safely by other means. For example, if you just want symbol indirection, you can use ~symbol-value~ (there is also ~symbol-function~). If you want to apply a function object to a sequence of arguments, you can use ~apply~ or ~funcall~. I know little about Elisp; more experienced hackers may know about other mechanisms that avoid the need for ~eval~. Regards -- - <https://stallmansupport.org> "In Support of Richard Stallman" - I am Brazilian. I hope my English is correct and I welcome feedback. - Free Software Supporter: <https://www.fsf.org/free-software-supporter> - If an email of mine arrives at your spam box, please notify me. ^ permalink raw reply [flat|nested] 72+ messages in thread
* rcd-template-eval - was Re: How to tame compiler? 2021-04-30 13:31 ` Jorge P. de Morais Neto @ 2021-04-30 19:38 ` Jean Louis 2021-04-30 19:48 ` rcd-template-eval, much is in Org mode Jean Louis ` (2 subsequent siblings) 3 siblings, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-04-30 19:38 UTC (permalink / raw) To: help-gnu-emacs * Jorge P. de Morais Neto <jorge+list@disroot.org> [2021-04-30 17:29]: > Hi all! > > Em [2021-04-22 qui 10:46:59-0400], Stefan Monnier escreveu: > > >> Is there a way to avoid these warnings? > > > > Yes: don't abuse `eval` ;-) > > Jean Louis, could you provide a little more detail on what are you using > ~eval~ for? Some tasks accomplished by eval can be done more safely by > other means. For example, if you just want symbol indirection, you can > use ~symbol-value~ (there is also ~symbol-function~). If you want to > apply a function object to a sequence of arguments, you can use ~apply~ > or ~funcall~. > > I know little about Elisp; more experienced hackers may know about other > mechanisms that avoid the need for ~eval~. Gladly. I use it to expand some values in templates. That is very handy and I use it already for many years. Normally it is for HTML and WWW publishing. But I may use it for local reports on the fly. It is very common beyond Emacs. It is similar to the nature of M4 pre-processing, which I have used back in past to create bunch of WWW pages. It is similar to various server side templates with embedded Perl or other programming languages, where there is more text and less programming code. (defvar rcd-template-delimiter-open "⟦") (defvar rcd-template-delimiter-close "⟧") (defun insert-rcd-lisp-brackets () (interactive) (let ((open "⟦") (close "⟧")) (insert (format "%s () %s" open close)) (backward-char 3))) ;; I have it in my key settings, when I press `C-c r i` I get this: ⟦ () ⟧ and then I can immediately write some expression like: ⟦ (+ 2 2) ⟧ if you now run the below function rcd-template-buffer-eval it will show you 4 on that place. ;; (define-key rcd-map "i" #'insert-rcd-lisp-brackets) (defun rcd-template-eval (string &optional delimiters) "Evaluates Emacs Lisp enclosed by `rcd-template-delimiter-open' and `rcd-template-delimiter-close'. Optional DELIMITERS list may be provided to change default delimiters, first list member has to be the opening delimiter and second the closing delimiter. Space or new line has to follow `rcd-template-delimiter-open' and precede `rcd-template-delimiter-close' for evaluation to get invoked." (let* ((delimiters (or delimiters (list rcd-template-delimiter-open rcd-template-delimiter-close))) (open (car delimiters)) (close (cadr delimiters))) (with-temp-buffer (insert string) (goto-char 0) (while (re-search-forward (rx (literal open) (one-or-more (or blank "\n")) (group (minimal-match (one-or-more anything))) (one-or-more (or blank "\n")) (literal close)) nil t) ;;(message "Found match") (let* ((lisp (car (read-from-string (buffer-substring-no-properties (1+ (match-beginning 0)) (1- (match-end 0)))))) (value (condition-case nil (eval lisp) (error ""))) (value (string-or-empty-string value))) ;; (message "HELLO: %s" (eval (format "%s" hello-name))) (delete-region (match-beginning 0) (match-end 0)) (insert (format "%s" value)))) (buffer-string)))) (defun rcd-template-buffer-eval () (interactive) (let* ((buffer (buffer-string)) (mode major-mode) (point (point))) (pop-to-buffer-same-window "Preview") (insert (rcd-template-eval buffer)) (goto-char point) (funcall mode) ;;(espeak "Preview") )) I have been using various templating systems before, and Perl was very fast, then I switched to Common Lisp and used CL-EMB, and tried to emulate it in Emacs Lisp, but syntax was kind of dirty like: <% (something here) %> or <% @var some-variable %> which I find easier like this: ⟦ some-variable ⟧ One can use any delimiters, I have chosen those ⟦ () ⟧ to input: type "C-x 8 RET 27e7" or "C-x 8 RET MATHEMATICAL RIGHT WHITE SQUARE BRACKET" In general, this function will be silent with error "" and thus in case that variable `some-variable' does not exist it will be empty. Practical use cases: Mass mailing lists are sent, and I wish to include recipient's names in the template: ⟦ to-name ⟧ would expand into their full name. ⟦ (gold-price-kg 1) ⟧ would expand to current gold price, there is no need for me to change the body text of the email. Prices are updated automatically, same for EUR/USD/GBP and other currencies. ⟦ (usd (gold-price-kg)) ⟧ would expand into US $57191 ⟦ to-email ⟧ would expand into their email address ⟦ unsubscribe-url ⟧ would expand into the per recipient customized URL to unsubscribe Time estimates can be caluclated and sent by email automatically that use current dates expanded in a template, not static dates. Similar for HTML and WWW publishing, static pages may be generated on the fly, expanded into Lisp values and transferred to web servers. Normally in Common Lisp, and CL-EMB templating package I would need to submit something like variables or list of variables, list alists to get variables expanded. But I prefer that it works with any variables. Instead of: (rcd-template-eval "Template ⟦ variable ⟧" '(variable "VALUE")) right now I prefer it this way: (let* ((variable "VALUE") (template "Template ⟦ variable ⟧") (expanded (rcd-template-eval template))) expanded) ⇒ "Template VALUE" However, there is problem as my programs are with lexical-binding ⇒ t, so then I have to watch to do following: (let* ((variable "VALUE") (template "Template ⟦ variable ⟧") (lexical-binding nil) (expanded (rcd-template-eval template))) expanded) ⇒ "Template VALUE" as otherwise it would not necessarily expand, depending where the function is defined. In the end this approach allows me to write plain text, Markdown, Org mode, just anything, and get the Emacs Lisp programs expanded before as pre-processing before the Markdown, Org mode or Asciidoc, Restructured Text or other type of processing. It of course works automatic. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* rcd-template-eval, much is in Org mode 2021-04-30 13:31 ` Jorge P. de Morais Neto 2021-04-30 19:38 ` rcd-template-eval - was " Jean Louis @ 2021-04-30 19:48 ` Jean Louis 2021-04-30 20:06 ` Tassilo Horn 2021-04-30 22:08 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-04-30 20:23 ` eval myths - Re: How to tame compiler? Jean Louis 2021-04-30 22:06 ` Emanuel Berg via Users list for the GNU Emacs text editor 3 siblings, 2 replies; 72+ messages in thread From: Jean Louis @ 2021-04-30 19:48 UTC (permalink / raw) To: help-gnu-emacs * Jorge P. de Morais Neto <jorge+list@disroot.org> [2021-04-30 17:29]: > Hi all! > > Em [2021-04-22 qui 10:46:59-0400], Stefan Monnier escreveu: > > >> Is there a way to avoid these warnings? > > > > Yes: don't abuse `eval` ;-) > > Jean Louis, could you provide a little more detail on what are you using > ~eval~ for? Some tasks accomplished by eval can be done more safely by > other means. For example, if you just want symbol indirection, you can > use ~symbol-value~ (there is also ~symbol-function~). If you want to > apply a function object to a sequence of arguments, you can use ~apply~ > or ~funcall~. > > I know little about Elisp; more experienced hackers may know about other > mechanisms that avoid the need for ~eval~. Org mode is one of popular modes, and it has 52 matches for "(eval " on my computer. See below. For almost 2 decades I use that for WWW publishing. Imagine: <html> <body> <title>⟦ (xml-escape "My new <title>") ⟧</title> </body> </html> it would expand into: <html> <body> <title>My new <title></title> </body> </html> and I like it that way more than CL-EMB, where I had to do something like: <html> <body> <title><% @var title -escape-xml %></title> </body> </html> We are eval-ing in Emacs more than we think when we use Org mode. -*- mode: grep; default-directory: "~/.emacs.d/elpa/org-20201216/" -*- Grep started at Fri Apr 30 22:43:55 grep --color=auto -nH --null -e "(eval " *.el ob-core.el\0231: (eval (or (cdr (assq :eval headers)) ob-core.el\0617: (and (boundp lang-headers) (eval lang-headers t)) ob-core.el\0870: (when (boundp lang-headers) (eval lang-headers t)))) ob-core.el\0908: (lang-headers (when (boundp lang-headers-var) (eval lang-headers-var t))) ob-core.el\01617: (eval raw-result t))) ob-core.el\02710: (if (stringp value) value (eval value t)))))) ob-core.el\02990: (eval (read cell) t)) ob-emacs-lisp.el\070: (result (eval (read (if (or (member "code" result-params) ob-shell.el\051: (eval `(defun ,(intern (concat "org-babel-execute:" name)) ob-shell.el\056: (eval `(defalias ',(intern (concat "org-babel-variable-assignments:" name)) ob-shell.el\061: (eval `(defvar ,(intern (concat "org-babel-default-header-args:" name)) '())))) ob-table.el\0127: (eval `(org-babel-parse-header-arguments ol-bbdb.el\0412: ((listp form) (eval form)) ol.el\01324: (eval (read path)) org-agenda.el\02910: (setq type (nth 2 entry) org-match (eval (nth 3 entry)) org-agenda.el\03241: (setq match (eval (nth 1 org-cmd))) org-agenda.el\03400: (eval (list 'org-batch-store-agenda-views))) org-agenda.el\03710: (eval form))) org-agenda.el\04128: (eval form))))))) org-agenda.el\06728: (setq rtn (concat (eval formatter) txt)) org-agenda.el\07257: (eval (cons 'or org-agenda-sorting-strategy-selected)) org-agenda.el\07511: (eval series-redo-cmd) org-agenda.el\08114: (unless (eval org-agenda-filter-form) org-agenda.el\08228: (eval org-agenda-jump-prefer-future)) org.el\08421: (eval `(let ,binds org.el\09329: (or (eval checklist) org.el\012473: (setq scope (eval scope))) org.el\014231: (eval form) org.el\014645: (result (if calendar-debug-sexp (eval sexp) org.el\014647: (eval sexp) org.el\016525: (eval org-speed-command)) org.el\018337: (not (equal (symbol-value v) (eval (car (get v 'standard-value))))))) org-macro.el\0152: '("n" . "(eval (org-macro--counter-increment $1 $2))") org-macro.el\0153: '("keyword" . "(eval (org-macro--find-keyword-value $1))") org-macro.el\0154: '("time" . "(eval (format-time-string $1))") org-macro.el\0155: '("property" . "(eval (org-macro--get-property $1 $2))"))))) org-macro.el\0180: (setq value (eval (condition-case nil (read value) org-macro.el\0334: (format "(eval (if (org-string-nw-p $1) %s %S))" org-macs.el\0176: `(eval (list 'let ,environment ',form))) org-macs.el\0626: (eval (cons 'let (cons list body)))) org-macs.el\0630: (eval (cons 'let (cons list1 (list (cons 'let (cons list2 body))))))) org-macs.el\0636: (eval form) org-mouse.el\0522: (eval `(org-agenda nil (string-to-char ,key)))) org-pcomplete.el\0429: (and (boundp lang-headers) (eval lang-headers t))))) org-table.el\02600: (eval (eval (read form))) ox.el\01572: (let ((value (eval (nth 3 cell)))) ox.el\03107: (mapconcat #'identity (eval (nth 3 entry)) " ") ox.el\03108: (eval (nth 3 entry))))) ox.el\03111: (push (cons option (eval (nth 3 entry))) options)))))) ox-odt.el\0538: (eval (car (widget-get w :args))))) ox-odt.el\0627: (eval (car (widget-get w :args))))) -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: rcd-template-eval, much is in Org mode 2021-04-30 19:48 ` rcd-template-eval, much is in Org mode Jean Louis @ 2021-04-30 20:06 ` Tassilo Horn 2021-04-30 22:08 ` Emanuel Berg via Users list for the GNU Emacs text editor 1 sibling, 0 replies; 72+ messages in thread From: Tassilo Horn @ 2021-04-30 20:06 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > For almost 2 decades I use that for WWW publishing. Imagine: > > <html> > <body> > <title>⟦ (xml-escape "My new <title>") ⟧</title> > </body> > </html> If I would want to do something like that, I'd just write a lispy HTML DSL so that I could write (foo/html (foo/body (foo/title (xml-escape "My new <title>")))) which is shorter, easier to type, and doesn't need `eval'. Bye, Tassilo ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: rcd-template-eval, much is in Org mode 2021-04-30 19:48 ` rcd-template-eval, much is in Org mode Jean Louis 2021-04-30 20:06 ` Tassilo Horn @ 2021-04-30 22:08 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-04-30 23:04 ` Org mode rant Jean Louis 1 sibling, 1 reply; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-04-30 22:08 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: > Org mode is one of popular modes Sure but not everyone likes it. > it has 52 matches for "(eval " on my computer But that's not the reason, is it? :O -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Org mode rant 2021-04-30 22:08 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-04-30 23:04 ` Jean Louis 2021-05-01 0:46 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 5:00 ` Org mode rant Bastien 0 siblings, 2 replies; 72+ messages in thread From: Jean Louis @ 2021-04-30 23:04 UTC (permalink / raw) To: help-gnu-emacs * Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> [2021-05-01 01:11]: > Jean Louis wrote: > > > Org mode is one of popular modes > > Sure but not everyone likes it. For notes I have been using database for long time, then in 2016, I found about Org mode, and it is quite helpful to quickly without direct LaTeX usage generate good quality PDF files, so I have been using it for projects mostly. As I deal with hundreds of people, soon there were too many Org files for each person tasks and transactions. That becomes mess, as I cannot query through it, text files are separate from each other. Sending or sharing tasks is pain, and I had to extend it myself, collaboration is non-existent. Then before few months I have decided to switch all Org files that have some tasks, notes, transactions into the database, and I will not go back. Now if I wish, I can generate and export to Org file, but not vice versa. This way I am editing things on meta-level. And I do like that. There are still 2500 Org files on my computer. But I have figured out how to move it to database. I like having the opportunity to reference even a single item in a list, which is not possible with Org. I like to reference any paragraph I wish or join and order Org chunks in the database as I wish, including mix Org chunks or database blobs with other types like images, videos, PDFs, Markdown, etc. Org is so much better for writing or document preparation than for management of procrastination, I mean tasks. One nice thing is that TODO is highlighted, but that is quite easy to achieve in Emacs anyway. There is too much hype about it. Blatant and sensational promotion. Oh my heaven. The hype draws many people to it, and so many get stuck into bad design. Text is text, but it wants to be structured text, and it wants to be database, but it cannot. And programmers try their best, but will never be a database. And because there is no connection to any kind of a database, it becomes very tiresome to code even simple things like tagging with some dates and stamps. Database has that already built-in and to keep trace of date/time stamps becomes trivial. Properties in Org file are right there in front of the eyes, confusing everybody who is confronted with it. My properties are in the database entry, I can see them on a click, but don't need to. TASKS - they are too often related to people, we have to do something for others, others have to do something for us, or for others, people do tasks, tasks are assigned to people, tasks are shared to people and groups of people. There are no such concepts in Org, it is left to user to find for himself, and there is no universaly helpful method. Org is pleasure, it is interesting, it will help those who otherwise could not help themselves and Org remains to be extremely useful. For me it is not. I like to create a task, like today, we receive Western Union in a group, I duplicate old task, change some information, press a key and task is sent by email to the assigned person, SMS notification follows up or even a call. While same can be done in Org file, due to it not really being structured with separate data from each other, it is much error prone. I found it surprising that a TASK cannot be default be assigned to a person and that there is no built-in function to send it by e-mail but I found my way with Org. > > it has 52 matches for "(eval " on my computer > > But that's not the reason, is it? :O Who knows. Org Babel has to evaluate scripts and insert into buffer. That is some type of evaluation I am doing for WWW publishing. I could as well evaluate templates with any other language specified. ⟦ (perl 2+2) ⟧ would work equally well as anything from "(perl" to ")" could be evaluated by perl, not Emacs Lisp. So much hype about Org and literate programming that people don't even find true beauties of programs such as: Cherrytree - hierarchical note taking application with rich text and syntax highlighting https://www.giuspen.com/cherrytree/ Leo editor vs Org-mode https://leoeditor.com/emacs.html Leo programmable editor http://leoeditor.com/ -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Org mode rant 2021-04-30 23:04 ` Org mode rant Jean Louis @ 2021-05-01 0:46 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 6:10 ` Jean Louis 2021-05-01 5:00 ` Org mode rant Bastien 1 sibling, 1 reply; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-01 0:46 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: >> Sure but not everyone likes it. > > For notes I have been using database for long time, then in > 2016, I found about Org mode, and it is quite helpful to > quickly without direct LaTeX usage generate good quality PDF > files Sorry, you can't do that. Org mode is a way of organizing data, it is not a generator of documents. Is the answer I got anyway when I asked how to make the result look civilized. Ha. re: LaTeX I was once told "you are obsessed with LaTeX" (Swedish "du är besatt av LaTeX", it literally means that). I answered "Yeah? What about you?" ("Okej? Du då?") and he just said "No" ("Nej") and left. In denial... > Markdown Markdown a lot of FOSS people have been in touch with since the READMEs with all the square brackets you get when you get FOSS software, that is Markdown. Unbelievable BTW, I was just using it! It can look like this to get a 2nd degree header, a quote and a table with centered columns and a hyperlink. I guess I like it fine - so far. ## version history _Try, try again!_ NGE version | start | teknologi | :-------:|:----------:|:---------:| ----------------------------------------------------------------------- 1 | 2020-09-13 | org | 2 | 2020-11-01 | HTML5/CSS | *[https://dataswamp.org/~incal/blog](https://dataswamp.org/~incal/blog) 3 | 2021-03-14 | md | (denna) > There is too much hype about [Org] One over-hyped piece of software: Org -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Org mode rant 2021-05-01 0:46 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-01 6:10 ` Jean Louis 2021-05-01 6:34 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 1 reply; 72+ messages in thread From: Jean Louis @ 2021-05-01 6:10 UTC (permalink / raw) To: help-gnu-emacs * Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> [2021-05-01 03:47]: > Jean Louis wrote: > > >> Sure but not everyone likes it. > > > > For notes I have been using database for long time, then in > > 2016, I found about Org mode, and it is quite helpful to > > quickly without direct LaTeX usage generate good quality PDF > > files > > Sorry, you can't do that. Org mode is a way of organizing > data, it is not a generator of documents. Is the answer I got > anyway when I asked how to make the result look civilized. Ha. Maybe it is not, but I use Org export functions to get nice PDF documents that people practically use in the field. > re: LaTeX I was once told "you are obsessed with LaTeX" > (Swedish "du är besatt av LaTeX", it literally means that). > I answered "Yeah? What about you?" ("Okej? Du då?") and he > just said "No" ("Nej") and left. Who knows which latex you meant... This one is rather spelled as LaTeH the other one is used for balloons and population minimization. > > Markdown > > Markdown a lot of FOSS people have been in touch with since > the READMEs with all the square brackets you get when you get > FOSS software, that is Markdown. > > Unbelievable BTW, I was just using it! I have no idea why would README be in Markdown, but never mind. Unless one wants to expand it into HTML, readme looks better without Markdown. First began using it back in the same year when it was published, today almost everybody uses it. I had static website generation before any free software came up with it. Today there are many. At that time, before maybe 16 years, would I mention static website generation I would almost get stoned. Markdown and few other markups for HTML have one huge flaw that nobody talks about, it misses the size for pictures which in the end turns HTML invalid. That is why I never use any other Markdown but Discount markdown for images. It is anyway fastest. Pandoc's markdown I may use sometimes to make nicer syntax highlighting for code, where there are no images involved. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Org mode rant 2021-05-01 6:10 ` Jean Louis @ 2021-05-01 6:34 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 9:41 ` On markdown images Jean Louis 0 siblings, 1 reply; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-01 6:34 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: > Maybe it is not, but I use Org export functions to get nice > PDF documents that people practically use in the field. Are you even allowed to do that? >> re: LaTeX I was once told "you are obsessed with LaTeX" >> (Swedish "du är besatt av LaTeX", it literally means that). >> I answered "Yeah? What about you?" ("Okej? Du då?") and he >> just said "No" ("Nej") and left. > > Who knows which latex you meant... This one is rather > spelled as LaTeH the other one is used for balloons and > population minimization. I don't remember what I used back then but now, if you by "which latex" mean what compiler and version, the answer is $ xelatex --version XeTeX 3.14159265-2.6-0.999992 (TeX Live 2020/Debian) By LaTeX I mean "[the] language [that] is described in the book LaTeX - A Document Preparation System." (latex(1)) >>> Markdown >> >> Markdown a lot of FOSS people have been in touch with since >> the READMEs with all the square brackets you get when you >> get FOSS software, that is Markdown. >> >> Unbelievable BTW, I was just using it! > > I have no idea why would README be in Markdown, but never > mind. Unless one wants to expand it into HTML, readme looks > better without Markdown. There are several reasons to do that but yes one is the possibility to produce the material in various other formats. I think Markdown looks better than plain text in markdown-mode (unbelievably not in vanilla Emacs, but I've already written about that so no more about that), I think the syntax isn't really disturbing anyone, it is also clear; apart from that font lock makes it colorful as well. > First began using it back in the same year when it was > published, today almost everybody uses it. I had static > website generation before any free software came up with it. > Today there are many. At that time, before maybe 16 years, > would I mention static website generation I would almost > get stoned. What is that, it generates static webpages? From some other data format, when that data is complete? IMO HTML is so simple one can just as well do it manually so don't have to bother with anything moving or still. > Markdown and few other markups for HTML have one huge flaw > that nobody talks about, it misses the size for pictures > which in the end turns HTML invalid. That is why I never use > any other Markdown but Discount markdown for images. It is > anyway fastest. What do you mean "misses the size for pictures"? You are right people don't seem to talk about this problem. -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* On markdown images 2021-05-01 6:34 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-01 9:41 ` Jean Louis 2021-05-01 9:59 ` Yuri Khan 2021-05-04 2:39 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 2 replies; 72+ messages in thread From: Jean Louis @ 2021-05-01 9:41 UTC (permalink / raw) To: help-gnu-emacs * Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> [2021-05-01 09:35]> > Maybe it is not, but I use Org export functions to get nice > > PDF documents that people practically use in the field. > > Are you even allowed to do that? Haha. > $ xelatex --version > XeTeX 3.14159265-2.6-0.999992 (TeX Live 2020/Debian) > > By LaTeX I mean "[the] language [that] is described in the book > LaTeX - A Document Preparation System." (latex(1)) I know that book. > > I have no idea why would README be in Markdown, but never > > mind. Unless one wants to expand it into HTML, readme looks > > better without Markdown. > > There are several reasons to do that but yes one is the > possibility to produce the material in various other formats. The original reason is none other but that Github wanted to display README files in better way but plain text. README was always traditionally plain text. Now people think it should be markdown. It is kind of deceptive. But purpose is to serve Github vendor. Like you say, it is readable, but it is also confusing to people who do now know the markup. > I think Markdown looks better than plain text in markdown-mode > (unbelievably not in vanilla Emacs, but I've already written > about that so no more about that), I think the syntax isn't > really disturbing anyone, it is also clear; apart from that > font lock makes it colorful as well. It is slow, markdown-mode is slow, I don't like it, but I have to deal with it. For simple documents is fine, for anything more complex it becomes slow. > > First began using it back in the same year when it was > > published, today almost everybody uses it. I had static > > website generation before any free software came up with it. > > Today there are many. At that time, before maybe 16 years, > > would I mention static website generation I would almost > > get stoned. > > What is that, it generates static webpages? From some other > data format, when that data is complete? IMO HTML is so > simple one can just as well do it manually so don't have to > bother with anything moving or still. 1. There is number of websites; for me or for people who I serve; maybe 64 or less, but that is what database says; 2. Each website may have different URLs, different server, different username/password, method of copy, different company name, maintainer and most importantly different HTML template; 3. Writing HTML by hand is taking more time then writin Markdown markup. Or Asciidoc, or Org, restructured text or similar. It saves time. 4. HTML templates have its menu, right? It has its heading, title, description, some footer stuff, those things are tiresome to be written by hand. They are best expanded from the known variables which I keep in the database. Website can have 1000+ pages, imagine writing each footer by hand, each menu by hand, each header and title by hand. Tiresome. > > Markdown and few other markups for HTML have one huge flaw > > that nobody talks about, it misses the size for pictures > > which in the end turns HTML invalid. That is why I never use > > any other Markdown but Discount markdown for images. It is > > anyway fastest. > > What do you mean "misses the size for pictures"? > > You are right people don't seem to talk about this problem. I think this is minimal valid SRC IMG tag in HTML: <src imag="file.jpg" height="120" width="100" alt="My file"/> So far none markdown that I know but Discount markdown does not provide height, width attributes. This makes HTML invalid and in general can disturb the HTML display and accessibility. Such pages will not pass the test here: https://validator.w3.org/ See: http://www.pell.portland.or.us/~orc/Code/discount/ Specifying image sizes An image size is defined by adding an additional =widthxheight field to the image tag: ![dust mite](http://dust.mite =150x150) produces dust mite But the syntax: ![dust mite](http://dust.mite =150x150) is only common to this version of Markdown. Anyway, this is fastest Markdown and self contained, unlike others which are slow or huge in size like pandoc. Normal markdown expression would be: ![dust mite](http://dust.mite) But that produced invalid HTML: (rcd-markdown "![dust mite](http://dust.mite)") ⇒ "<p><img src=\"http://dust.mite\" alt=\"dust mite\" /></p> " While this produces valid HTML: (rcd-markdown "![dust mite](http://dust.mite =150x150)") ⇒ "<p><img src=\"http://dust.mite\" height=\"150\" width=\"150\" alt=\"dust mite\" /></p> " As a side note, I have a workflow when I wish to include many images at once, I can just mark them in Dired, and invoke a function that constructs the markup, insert into buffer and finished. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: On markdown images 2021-05-01 9:41 ` On markdown images Jean Louis @ 2021-05-01 9:59 ` Yuri Khan 2021-05-01 10:18 ` Jean Louis 2021-05-04 2:39 ` Emanuel Berg via Users list for the GNU Emacs text editor 1 sibling, 1 reply; 72+ messages in thread From: Yuri Khan @ 2021-05-01 9:59 UTC (permalink / raw) To: help-gnu-emacs On Sat, 1 May 2021 at 16:43, Jean Louis <bugs@gnu.support> wrote: > I think this is minimal valid SRC IMG tag in HTML: > > <src imag="file.jpg" height="120" width="100" alt="My file"/> > > So far none markdown that I know but Discount markdown does not > provide height, width attributes. This makes HTML invalid and in > general can disturb the HTML display and accessibility. Such pages > will not pass the test here: https://validator.w3.org/ You have been misinformed on that point. The width and height attributes are, and always have been, optional on an img element. See specs: HTML 5 — https://www.w3.org/html/wg/spec/the-map-element.html#attr-dim-width HTML 4.01 — https://www.w3.org/TR/html4/struct/objects.html#adef-width-IMG HTML 3.2 — https://www.w3.org/TR/2018/SPSD-html32-20180315/#img HTML 2.0 did not have width and height attributes on img elements. ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: On markdown images 2021-05-01 9:59 ` Yuri Khan @ 2021-05-01 10:18 ` Jean Louis 2021-05-01 11:09 ` Yuri Khan 0 siblings, 1 reply; 72+ messages in thread From: Jean Louis @ 2021-05-01 10:18 UTC (permalink / raw) To: Yuri Khan; +Cc: help-gnu-emacs * Yuri Khan <yuri.v.khan@gmail.com> [2021-05-01 13:00]: > On Sat, 1 May 2021 at 16:43, Jean Louis <bugs@gnu.support> wrote: > > > I think this is minimal valid SRC IMG tag in HTML: > > > > <src imag="file.jpg" height="120" width="100" alt="My file"/> > > > > So far none markdown that I know but Discount markdown does not > > provide height, width attributes. This makes HTML invalid and in > > general can disturb the HTML display and accessibility. Such pages > > will not pass the test here: https://validator.w3.org/ > > You have been misinformed on that point. The width and height > attributes are, and always have been, optional on an img element. See > specs: > > HTML 5 — https://www.w3.org/html/wg/spec/the-map-element.html#attr-dim-width > HTML 4.01 — https://www.w3.org/TR/html4/struct/objects.html#adef-width-IMG > HTML 3.2 — https://www.w3.org/TR/2018/SPSD-html32-20180315/#img > HTML 2.0 did not have width and height attributes on img elements. You see, after so many years, I get this smacking slap and come back to reality. Who knows what is the real reason why I started using it. I think back in time, before maybe 10 years there were different directions in creating HTML documents. Probably I was using page load speed or other type of validator and have mistaken it for HTML validator, thanks for correction. https://web.dev/optimize-cls/?utm_source=lighthouse&utm_medium=unknown#images-without-dimensions For example Google Page speed says: Image elements do not have explicit width and height Set an explicit width and height o -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: On markdown images 2021-05-01 10:18 ` Jean Louis @ 2021-05-01 11:09 ` Yuri Khan 2021-05-01 11:25 ` Jean Louis 2021-05-02 19:30 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 2 replies; 72+ messages in thread From: Yuri Khan @ 2021-05-01 11:09 UTC (permalink / raw) To: Yuri Khan, help-gnu-emacs On Sat, 1 May 2021 at 17:23, Jean Louis <bugs@gnu.support> wrote: > Probably I was using page load speed or other type of validator and > have mistaken it for HTML validator, thanks for correction. Width and height attributes, when their values are correct, do help the browser lay out the page. It can reserve a known space before the image gets downloaded and go on processing the rest of the page. When width and height are missing, the browser does not know how much space to reserve, so, when it finally receives the image and finds out its dimensions, it has to go back and re-layout everything from the point of the image. Explicit width and height attributes are not the only way to mitigate this. For example, one could specify image dimensions in CSS. Or just redefine some images to be block elements and fit 100% of their container width. ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: On markdown images 2021-05-01 11:09 ` Yuri Khan @ 2021-05-01 11:25 ` Jean Louis 2021-05-02 19:30 ` Emanuel Berg via Users list for the GNU Emacs text editor 1 sibling, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-05-01 11:25 UTC (permalink / raw) To: Yuri Khan; +Cc: help-gnu-emacs * Yuri Khan <yuri.v.khan@gmail.com> [2021-05-01 14:10]: > Width and height attributes, when their values are correct, do help > the browser lay out the page. It can reserve a known space before the > image gets downloaded and go on processing the rest of the page. > > When width and height are missing, the browser does not know how much > space to reserve, so, when it finally receives the image and finds out > its dimensions, it has to go back and re-layout everything from the > point of the image. > > Explicit width and height attributes are not the only way to mitigate > this. For example, one could specify image dimensions in CSS. Or just > redefine some images to be block elements and fit 100% of their > container width. That was it. Yet to specify image dimensions in CSS within Markdown context becomes difficult. If it is separate CSS, it would be tiresome, if it would be inline CSS, alright somehow, but none Markdown support that so far. One can always write HTML in Markdown documents, of course, but that does not help. Some pictures have different proportions and they may come up dynamically, I would not like displaying such with incorrect proportions. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: On markdown images 2021-05-01 11:09 ` Yuri Khan 2021-05-01 11:25 ` Jean Louis @ 2021-05-02 19:30 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-03 5:43 ` Yuri Khan 1 sibling, 1 reply; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-02 19:30 UTC (permalink / raw) To: help-gnu-emacs Yuri Khan wrote: > Width and height attributes, when their values are correct, > do help the browser lay out the page. It can reserve a known > space before the image gets downloaded and go on processing > the rest of the page. > > When width and height are missing, the browser does not know > how much space to reserve, so, when it finally receives the > image and finds out its dimensions, it has to go back and > re-layout everything from the point of the image. > > Explicit width and height attributes are not the only way to > mitigate this. For example, one could specify image > dimensions in CSS. Or just redefine some images to be block > elements and fit 100% of their container width. That so? I have the width here: .images_right { float: right; padding-top: 6px; width: 206px; } # [1] But the height vary from image to image, should I put it "explicitly" as attributes in the HTML [2] then? That doesn't feel right because isn't the point of HTML/CSS to have all that in CSS? OTOH to have one CSS class for every image feels ... lame. And a lot of typing. [1] https://dataswamp.org/~incal/index.css [2] https://dataswamp.org/~incal/index.html -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: On markdown images 2021-05-02 19:30 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-03 5:43 ` Yuri Khan 2021-05-03 17:08 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 1 reply; 72+ messages in thread From: Yuri Khan @ 2021-05-03 5:43 UTC (permalink / raw) To: Emanuel Berg, help-gnu-emacs On Mon, 3 May 2021 at 02:31, Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> wrote: > I have the width here: > > .images_right { > float: right; > padding-top: 6px; > width: 206px; > } # [1] > > But the height vary from image to image, should I put it > "explicitly" as attributes in the HTML [2] then? I wouldn’t. Having width in CSS and height in HTML feels wrong. > OTOH to have one CSS class for every image feels ... lame. > And a lot of typing. True. I feel there are multiple distinct use cases for images, and they warrant different approaches: * Icons. You typically know the size beforehand and use the same size for all icons. So .icon { width: 24px; height: 24px; } * Large photos. You prepare them in as high resolution as possible and let the browser scale them down to fit the window: .photo { display: block; max-width: 100%; } You let the browser calculate the height on its own, accepting the layout delay. Fortunately, the visual effect of re-layout is not as annoying for block images as it would be for inline images. * Screenshots, pixel art, and line art. In contrast with photos, you typically do not want to allow arbitrary scaling for these. So you either specify the exact dimensions in HTML to help the browser lay them out, or in CSS (but this leads to one class for every image), or you let the browser sort it out on its own. (NB: The latter is bad for HiDPI screenshots, as they will be displayed at twice their natural size. Also, if displaying normal DPI pixel images at their natural size, instruct browsers on HiDPI displays to use crisp image scaling algorithm: .pixelart { image-rendering: -moz-crisp-edges; image-rendering: -webkit-optimize-contrast; } otherwise it will come out all blurry.) ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: On markdown images 2021-05-03 5:43 ` Yuri Khan @ 2021-05-03 17:08 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-03 23:22 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 1 reply; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-03 17:08 UTC (permalink / raw) To: help-gnu-emacs Yuri Khan wrote: >> But the height vary from image to image, should I put it >> "explicitly" as attributes in the HTML [2] then? > > I wouldn’t. Having width in CSS and height in HTML > feels wrong. But to have the same value (the width) appear over and over in HTML isn't good either and there is already a CSS class, and removing width from it won't remove the class since there are other settings there as well... Individual CSS classes for height only option to my mind, I think the height is the same for a bunch of pics tho, so that one can put in the base class along with the shared settings, then the imgs that have different height they get their own class in addition to the base class which will override it with respect to height only... -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: On markdown images 2021-05-03 17:08 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-03 23:22 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 0 replies; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-03 23:22 UTC (permalink / raw) To: help-gnu-emacs >>> But the height vary from image to image, should I put it >>> "explicitly" as attributes in the HTML [2] then? >> >> I wouldn’t. Having width in CSS and height in HTML >> feels wrong. > > But to have the same value (the width) appear over and over > in HTML isn't good either and there is already a CSS class, > and removing width from it won't remove the class since > there are other settings there as well... > > Individual CSS classes for height only option to my mind, > I think the height is the same for a bunch of pics tho, so > that one can put in the base class along with the shared > settings, then the imgs that have different height they get > their own class in addition to the base class which will > override it with respect to height only... Got it to work with CSS only, lines 36-49: https://dataswamp.org/~incal/index.css No reflow! :) -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: On markdown images 2021-05-01 9:41 ` On markdown images Jean Louis 2021-05-01 9:59 ` Yuri Khan @ 2021-05-04 2:39 ` Emanuel Berg via Users list for the GNU Emacs text editor 1 sibling, 0 replies; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-04 2:39 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: >> By LaTeX I mean "[the] language [that] is described in the >> book LaTeX - A Document Preparation System." (latex(1)) > > I know that book. I know right? Everyone should have a buddy like me to teach them new stuff... > README was always traditionally plain text. Now people think > it should be markdown. It is kind of deceptive. But purpose > is to serve Github vendor. Files in UPPERCASE are text files and the upcase is a way of telling this file is intended to be read by a human, not processed by the computer. > I think this is minimal valid SRC IMG tag in HTML: > > <src imag="file.jpg" height="120" width="100" alt="My file"/> I think not :) -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Org mode rant 2021-04-30 23:04 ` Org mode rant Jean Louis 2021-05-01 0:46 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-01 5:00 ` Bastien 2021-05-01 5:10 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 9:16 ` Jean Louis 1 sibling, 2 replies; 72+ messages in thread From: Bastien @ 2021-05-01 5:00 UTC (permalink / raw) To: Jean Louis; +Cc: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > Org is so much better for writing or document preparation than for > management of procrastination, I mean tasks. I like the expression "management of procrastination". I'm using Org quite a lot and I also think it does not fix discipline, which is what is ultimately required for managing your tasks. I write a blog entry about to-do lists that you might find useful, as it is not directly connected to Org: https://bzg.fr/en/on-using-to-do-lists-efficiently/ -- Bastien ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Org mode rant 2021-05-01 5:00 ` Org mode rant Bastien @ 2021-05-01 5:10 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 9:16 ` Jean Louis 1 sibling, 0 replies; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-01 5:10 UTC (permalink / raw) To: help-gnu-emacs Bastien wrote: > I write a blog entry about to-do lists that you might find > useful, as it is not directly connected to Org: > > https://bzg.fr/en/on-using-to-do-lists-efficiently/ You can include mine if you'd like to, it isn't connected to Org directly or indirectly - I yank it last. There are some things that can be improved but they were actually never put on the TODO list so it is not like they are tasks that I never did or anything... ;;; -*- lexical-binding: t -*- ;;; ;;; this file: ;;; http://user.it.uu.se/~embe8573/emacs-init/todo-did.el ;;; https://dataswamp.org/~incal/emacs-init/todo-did.el (defun todo-get-buffer () (let*((todo-env-var "TODO_FILE") (todo-file (getenv todo-env-var)) (todo-buffer (if todo-file (find-file-noselect todo-file t) (error "Set the env var %s first" todo-env-var) ))) todo-buffer) ) (defun todo-sort-and-save () (sort-lines nil (point-min) (point-max)) ; not REVERSE (whitespace-cleanup) (save-buffer) ) (defun todo-insert-entry (what buffer) (with-current-buffer buffer (goto-char (point-max)) (insert "\n" what) (todo-sort-and-save) )) (defun todo (what) (interactive "sdo what: ") (let ((todo-buffer (todo-get-buffer))) (todo-insert-entry what todo-buffer) )) (defun todo-show-file () (interactive) (let ((todo-buffer (todo-get-buffer))) (with-current-buffer todo-buffer (when (buffer-modified-p todo-buffer) (todo-sort-and-save) ) (switch-to-buffer todo-buffer) ))) -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Org mode rant 2021-05-01 5:00 ` Org mode rant Bastien 2021-05-01 5:10 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-01 9:16 ` Jean Louis 2021-05-01 10:06 ` Bastien ` (2 more replies) 1 sibling, 3 replies; 72+ messages in thread From: Jean Louis @ 2021-05-01 9:16 UTC (permalink / raw) To: Bastien; +Cc: help-gnu-emacs * Bastien <bzg@gnu.org> [2021-05-01 08:00]: > Jean Louis <bugs@gnu.support> writes: > > > Org is so much better for writing or document preparation than for > > management of procrastination, I mean tasks. > > I like the expression "management of procrastination". > > I'm using Org quite a lot and I also think it does not fix discipline, > which is what is ultimately required for managing your tasks. > > I write a blog entry about to-do lists that you might find useful, as > it is not directly connected to Org: > > https://bzg.fr/en/on-using-to-do-lists-efficiently/ I have great affinity to this type of thinking and analyzing. Nice reference to "freedom of concern"... It is interesting that there are people who never make any notes, tasks, whatever written, and they are successful in life and accomplish so many things. This should say that our success does not necessarily depend of writing things down. Do you mean to-do lists become your own enemy when there is much of them or when they become not easily manageable, bringing person into confusion? My personal Org mode use is mostly focused on repeatable projects. Project has its goals, purposes, operational targets and production targets and similar, they are printed and assigned to people who do those projects. This month maybe 50 people attended the some of such projects and about 5-10 of them are soon to finish it. The to-do list is thus replicated and given to people in form of a whole assignment. In this area we have all clarity we need and want. > Because it gives you a false sense of control, it slowly erodes your > goals' clarity, which weakens your motivation. You end up being > controlled by a list of things to do instead of focusing on doing > them. You hope that your tool will help you achieve self-discipline > instead of disciplining yourself to use it the right way. Maybe if you tell your practical use case where you got stuck, then it would become clearer for me as reader. I am so much interested. There are those to-do tasks that are immediately actionable, doable, and those that are not doable. There are those with priority and those with less priority. Projects and planning never eroded my goals' clarity as I write goal in the first place as authoritative to the subordinate assignments (tasks or to-do). That is maybe method not so much used by Org mode users, it is like from top to bottom, first defined most important fundamentals, then define subordinate actions to be done. If somebody starts putting everything together, like personal tasks, business tasks, lovers' tasks and notes in once, without having clear separation, well that may erode totally the goals and purposes. I wish I could understand it better how it happened to you. > Write less to-do items and more notes. Notes and "remember" lists are > always good. But do not blur the line between what you want to > remember and what you need to do3. Your to-do list should be a list of > things to do, not to remember. To-do lists should describe what you > must do, not what you want to do, which belongs on the "remember" list > until you really must do it. I wish I could understand it. If there is action item to do, it is to do, writing notes about it will never get it done. I cannot write less actions to do then I have it. Maybe some people never understood the distinction and they write TODO even where there is nothing to be done. I am sure you have got a good advise, I just miss to see it. Maybe there need to be practical example to understand it better. Let us say I have person to receive Western Union for me, this is my real world and current task to-do, I click a key, assign the action to the person and provide instructions, click another key and person is informed by email, SMS, I could invoke a call from computer as well. Any time later I can see which are pending tasks for which people, I can review it. Maybe I should have visual reminders, it will come. In that particular example I do not see how I can write less to-do actionable items, and I cannot see how would it be useful to write notes on the side not related to actionable item. I wish I could understand. There are some unfinished notes that lead to action, they have to be finished, so they have label ACTION (same as TODO), but are not of highest priority. They may be pending for quite some time, they need thinkering, focus. However, all tasks are sorted into some sets or parent nodes. Those parent nodes can have its own priorities. For example if I am in working time period, I will look into tasks related to that working time period. If I am in leisure time, I could look into tasks which do not relate to business. If I focus on relatives, family or friends, let us say I focus on particular person, I will list tasks for that person as now came the time to handle things for that particular person. I wish to understand what you mean, but have hard time. Practical example is welcome. Editors are really great and fundamental tool for planning. IMHO even simple text file, sections of text and search functions just good enough. I study this subject last months. In my database I keep ACTION on different types, for example type could be WWW hyperlink. That requires me to open it up, review the page, and maybe draw some conclusions or do something with the information. That may not be highest priority. There is type "Task" which has definitely higher priority than WWW type. There is type "Set" which can have ACTION assigned, that means all items in the set are actionable, but grouped. If it is some list of videos for learning on distance, then the play list could be invoked. But overall Set can be skipped if it is not time for learning. I have "Org" type which is whole Org file in the database with ACTION assigned, for example design and planning of the database system, or equipment list for particular business site, or various notes that need yet sorting. There is FOLLOW-UP type which means I have to follow specific people, this may be done regularly at specific time intervals. As TODO items are separate by its types, by its sets or groups, by its priorities it becomes easy to make intersections. Intersections help in clarity. > Take extra care of your agenda. Agendas are necessary, scheduled > tasks and deadlines are useful. But do not schedule a task unless it > really needs to be done on a specific date, refrain from using > deadlines if nothing requires them. Over-scheduling is another way > of mixing what you want to do and what you need to do. If your > agenda is growing with many tasks, that's an sign that you should > rethink if they really need to be scheduled or to have a deadline. Good advise, understandable, clear. Thank you. Most of tasks I have I don't schedule, because they are so imminent that I have to do it right away. Assigned tasks are almost never scheduled, I let people do it at their own pace and availability and it works very well apparently. But if specific task has to be done on Monday, it would tell in the description. Using scheduled attributes is definitely very useful. Sometimes I had about 180 appointments in year, appointment could be scheduled for months in advance, that requires tracking and using calendar. Like you said, it is good to minimize confusion. > Don't overload tasks with details, don't overload your agenda with > tasks and don't mix notes and tasks—that's basically it. Yes, sure, but this probably applies to Org mode or text based stuff. Not to really well structured objects. The database is mixing everything, but its presentation, queries and views give the precise clarity. I can for example say to computer, give me list of people in groups created after 2021-05-01, who already started on the project I have assigned them, and provided me their email address, while all others have only phone number. As with SQL databases that type of query becomes possible. With text only, that becomes tiresome and requires programmers to code and code and code. That is why I cannot recommend Org mode for some more professional use, unspoken for collaborative use. Unless Org mode itself is stored in the database. As that solves those problems. I really hope that my breaking down of your article will not bother you, myself I want to learn more about principles of note taking, it is my special subject of study now. > Writing self-contained tasks reinforces your sense of clarity4, > keeping a minimal agenda lets you in control, and richer notes will > nurture your motivation, while a minimal list of tasks will help > boosting your sense of achievement. Self-contained tasks are understandable, that is how I write tasks. All instructions are inside. Task is a note too, but "Task" represents rather type of a note. Agenda should have those necessary tasks or whatever appointments, and goal should be to attend those scheduled objects and do them, not to minimize them. I can only vague idea on what is meant with minimize. I would not like minimizing my agenda. Maybe you assume that too many people will decide on their agenda in too broad manner, so to say to write scheduled items even when they are not necessary. When I have to meet somebody on Sunday, I have to, I cannot minimize it. Or if I have to visit some office at Monday, I have to, I wish I could minimize it, but life obligations are quite strict. > Now I suspect we are all very bad at using to-do lists. Why? Oops. Do you really think so? I have met some elder women who gave so much good value to other people and society and they never missed an appointment or similar. I know one close to me, she never put anything on paper, but never forgets what is to be done, a virtue that was so much common and present in times before the access to computers and devices. Then I can remember times when I was using exclusively written lists for a week, and I have accomplished all of them, or maybe few were left not done, and were moved to the next week. I like your article, I wish I could find more of it, some things I did not understand as for those maybe I do not have or do not find personal correlation. Org mode files I have been using mostly to assign tasks related to people, each person had an Org file. It was quite easy to see who did what, when, how. And I had money transactions inside. I have not been writing those Org files, I just made a function, press key, and Org file is generated with its title, sections, table of transactions, like template. With number of people growing, that became tiresome, transactions, instead being on one central place becomes scattered all around. That I have moved to database work, invoke function or key, then I say transaction is from person Happiness to Jean, this much money in this currency, finished. Instead on focusing on formatting the Org table, I just enter numbers. If I wish to produce Org table out of the database, I guess that can be created. But working with structured data on a meta level seem to give me more organization then working on non-structured and digitally unrelated data in multiple Org files, even in one Org file, objects are mostly not digitally related to each other (they are related in our mind). Tasks assigned to people, if managed in a central database, avoid the Org to look for numerous Org files on the system. One can invoke a key, list people who have pending tasks and list those assignments for each person separately. Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Org mode rant 2021-05-01 9:16 ` Jean Louis @ 2021-05-01 10:06 ` Bastien 2021-05-01 10:42 ` Jean Louis 2021-05-01 10:10 ` Bastien 2021-05-01 10:10 ` Bastien 2 siblings, 1 reply; 72+ messages in thread From: Bastien @ 2021-05-01 10:06 UTC (permalink / raw) To: Jean Louis; +Cc: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: >> Because it gives you a false sense of control, it slowly erodes your >> goals' clarity, which weakens your motivation. You end up being >> controlled by a list of things to do instead of focusing on doing >> them. You hope that your tool will help you achieve self-discipline >> instead of disciplining yourself to use it the right way. > > Maybe if you tell your practical use case where you got stuck, then it > would become clearer for me as reader. I am so much interested. I cannot go into details about my real use-case here but the gist of the paragraph you quote is this: once in a while you feel your tool is not helpful enough for handling your to-do, and then you start trying to fix your Org configuration, trusting it even more, instead of sticking to the principles I tried to outline in my post. -- Bastien ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Org mode rant 2021-05-01 10:06 ` Bastien @ 2021-05-01 10:42 ` Jean Louis 0 siblings, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-05-01 10:42 UTC (permalink / raw) To: Bastien; +Cc: help-gnu-emacs * Bastien <bzg@gnu.org> [2021-05-01 13:06]: > Jean Louis <bugs@gnu.support> writes: > > >> Because it gives you a false sense of control, it slowly erodes your > >> goals' clarity, which weakens your motivation. You end up being > >> controlled by a list of things to do instead of focusing on doing > >> them. You hope that your tool will help you achieve self-discipline > >> instead of disciplining yourself to use it the right way. > > > > Maybe if you tell your practical use case where you got stuck, then it > > would become clearer for me as reader. I am so much interested. > > I cannot go into details about my real use-case here but the gist of > the paragraph you quote is this: once in a while you feel your tool is > not helpful enough for handling your to-do, and then you start trying > to fix your Org configuration, trusting it even more, instead of > sticking to the principles I tried to outline in my post. I get it. Yes, that is exactly observation I had too before few months, it brought me to the condition to escape Org mode and rather use it more in the sense of markup of the overal instructions. Maybe the article shall more clearly refer to Org mode, rather than being general note-taking statement. Org Hype is fine, I like it. Not that I find Org mode exponentially useful. I guess people tend, like me too, to designate or determine one system "this is it" and build upon it for quite long time, even rest of the life, even though "this isn't the one". As a side note, here is the workflow I have for things assigned to other people or to me: 1. Have Org template ready with instructions and repeatable project in the database; all items inside are always "TODO"; there is no file on file system; 2. Copy template with single key, assign whole node to single person; this is like single TODO tag; 3. Share document by email to that person; share 20 such projects assigned to multiple people; 4. Receive reports; update what is "DONE" in their nodes related to specific person, in the central file or as central node (Org blob), but that does not necessarily complete the overal assignment for the person; but it is not necessary to use "DONE/TODO" in such project as overall assignment is maybe "Sell service for US $100,000" -- maybe single task tells "Prepare list of 2000 people" -- but if salesman already got a client for to buy the service, all other tasks become redundant, as purpose has been achieved during the project execution. Some people have serious troubles understanding the purpose and single tasks, and will rather go doing single tasks for the sake of themselves only while forgetting the purpose. If purpose have been achieved, even that single task becomes redundant. 5. When assignment is done, mark with COMPLETE, and write report about it; Instead of pending tasks, I can search for people pending the assignment. Agenda becomes list of people and their pending project title. Archiving becomes redundant too, as the node is anyway archived in the database and whole instruction marked as COMPLETED, though there are are maybe redundant tasks inside of node still marked with TODO -- such will never appear in any agenda or list because they are irrelevant as the overall purpose is COMPLETED. Person goes out to buy new shoes, and make a list of 10 shops to visit, but maybe shoe seller on street has already got some nice shoes, thus all other tasks for the sake of purpose, become redundant. This is not always so, it depends of task types of course. Org mode can also be used as presentation of the database backed information where each heading or section may be edited, as long as there is right property defined, the information may be updated in the database. Then the Org mode, rather Org method of editing could become truly collaborative, not necessarily in he real time. A salesman Jimmy in New York, could request information on customer Joe, information can be displayed as Org mode. Salesman may edit some personal information of Joe, such is updated to central database in Boston. Another salesman Mark may be editing a note belonging to client Joe, and update it, both Jimmy and Mark would get notice of it; Mark could give assignment to Joe to make a call to customer and englighten him on new products; Joe's Org file would get a notice and Org file would get updated; Joe makes a phone call and right notice, the notes get updated in the database; each of them is collaborating by using apparently simple Org file while underlying functions connect each heading to the central database. People mostly use WWW browsers for that type of Customer Relationship Management software, yet Emacs can be used with Org mode editing. Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Org mode rant 2021-05-01 9:16 ` Jean Louis 2021-05-01 10:06 ` Bastien @ 2021-05-01 10:10 ` Bastien 2021-05-01 11:19 ` Jean Louis 2021-05-01 13:48 ` [External] : " Drew Adams 2021-05-01 10:10 ` Bastien 2 siblings, 2 replies; 72+ messages in thread From: Bastien @ 2021-05-01 10:10 UTC (permalink / raw) To: Jean Louis; +Cc: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: >> Write less to-do items and more notes. Notes and "remember" lists are >> always good. But do not blur the line between what you want to >> remember and what you need to do3. Your to-do list should be a list of >> things to do, not to remember. To-do lists should describe what you >> must do, not what you want to do, which belongs on the "remember" list >> until you really must do it. > > I wish I could understand it. My point here is this one: psychologically, I often find it difficult to resist the temptation of noting something down *before* I know if it is something I need to do or just something I need to remember to check at some point, ending up with my to-do list presenting me with to many things to do, some of them not really belonging here. Now I force myself to really ponder: "Do you really need to do it? If not, do you want to remember it?" and I do this *before* I write or capturing. -- Bastien ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Org mode rant 2021-05-01 10:10 ` Bastien @ 2021-05-01 11:19 ` Jean Louis 2021-05-01 13:48 ` [External] : " Drew Adams 1 sibling, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-05-01 11:19 UTC (permalink / raw) To: Bastien; +Cc: help-gnu-emacs * Bastien <bzg@gnu.org> [2021-05-01 13:10]: > Jean Louis <bugs@gnu.support> writes: > > >> Write less to-do items and more notes. Notes and "remember" lists are > >> always good. But do not blur the line between what you want to > >> remember and what you need to do3. Your to-do list should be a list of > >> things to do, not to remember. To-do lists should describe what you > >> must do, not what you want to do, which belongs on the "remember" list > >> until you really must do it. > > > > I wish I could understand it. > > My point here is this one: psychologically, I often find it difficult > to resist the temptation of noting something down *before* I know if > it is something I need to do or just something I need to remember to > check at some point, ending up with my to-do list presenting me with > to many things to do, some of them not really belonging here. When you note something in that example, do you put a tag TODO in Org? If so, why not just leave it without TODO... > Now I force myself to really ponder: "Do you really need to do it? > If not, do you want to remember it?" and I do this *before* I write > or capturing. It's interesting to exchange. Constant writing, noting, pondering may definitely lead to moments like described. If I may compare to my workflow I have not found myself thinking beforehand if I need to do something or to remember it (note it), as that decision has already been made, so I am writing something that has to be done or I am writing a note. Like "fetch money from Western Union office" -- it is harder to get into thinking should I just remember it, or should I do it -- as if I just remember it, money will not come in my hands. The distinction on what is ACTION (actionable) and what is NOT ACTION should be very clear in any note taking system. Refining those objects further with their types, classes, properties is great feature in any note taking system. Since I have switched from Org to database meta level outline where each node can be something else like Org, enriched text, image, video, etc. the decision comes first on the type. Do I want to follow up some person's development, like sales process, learning process? I press key for that. Do I want to assign task to somebody? There is special key. Do I want to create new task for me? There is key for that. This type of task in Org is just fine to be described as a heading, especially of there are various tasks related to each other, each actionable without mixture with notes. * Pay ticket to town * Fetch money from Western Union * Purchase bread, come back home If there are however notes around, that is where it becomes mixture that does not give clarity: * Pay ticket to town * Prices of tickets to town * List of Western Union offices * Bread types I like * Fetch money from Western Union * Purchase bread, come back home That is where nicely marked TODO items make a visual distinction: * TODO Pay ticket to town * Prices of tickets to town * List of Western Union offices * Bread types I like * TODO Fetch money from Western Union * TODO Purchase bread, come back home Then we get more confusion with priorities as the list could also look like this: * Prices of tickets to town * TODO [#B] Fetch money from Western Union * TODO [#C] Purchase bread, come back home * List of Western Union offices * Bread types I like * TODO [#A] Pay ticket to town Priorities in Org mode are attributes that may be used in queries, but I guess there is no sorting or ordering function yet. If those nodes are in the database, single key is moving one task up or down in the priorities order. Some things must come before other things. I recommend separating notes and actionable items: * Notes ** Prices of tickets to town ** List of Western Union offices ** Bread types I like * Tasks [0/3] [0%] ** TODO [#A] Pay ticket to town ** TODO [#B] Fetch money from Western Union ** TODO [#C] Purchase bread, come back home where by if tasks are written in the chronological order, priorities should also become redundant as the order itself designates priorities: * Tasks [0/3] [0%] ** TODO Pay ticket to town ** TODO Fetch money from Western Union ** TODO Purchase bread, come back home Another problem we have are relations, we do want to know where are Western Union offices, but the note can be far somewhere even in the other file. That makes things difficult. Then we have option to tag things that are related: * Notes ** Prices of tickets to town :transport: ** List of Western Union offices :western: ** Bread types I like :bread: * Tasks [0/3] [0%] ** TODO Pay ticket to town :transport: ** TODO Fetch money from Western Union :western: ** TODO Purchase bread, come back home :bread: Then one has to use Agenda function to find items by the tag, to find what is related. And if we have few more tags, it becomes really messy: * Notes related to Munich :notes:munich:germany:eu: ** Prices of tickets to town :transport:bus:tram:taxi: ** List of Western Union offices :western:money:family: ** Bread types I like :bread:cakes:birthday: * Tasks [0/3] [0%] :action: ** TODO Pay ticket to town :transport:bus: ** TODO Fetch money from Western Union :western:munich: ** TODO Purchase bread, come back home :bread:mother: And I have not yet mentioned property lists, which may visually disturb the user and make it all tiresome. When working with the database, specific items can simply be related to each other. Press key and see all related items. But nothing need to visually bother user. Number of tags can be unlimited, it is just a string separated with spaces. Tags could be 20 for a single item and as they are in the database, such tags need not be displayed visually on the side to the heading. If person then wants to find all money related items it becomes trivial, without searching for files, pressing R remove from Agenda, etc, what else. Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* RE: [External] : Re: Org mode rant 2021-05-01 10:10 ` Bastien 2021-05-01 11:19 ` Jean Louis @ 2021-05-01 13:48 ` Drew Adams 2021-05-01 14:05 ` Emanuel Berg via Users list for the GNU Emacs text editor 1 sibling, 1 reply; 72+ messages in thread From: Drew Adams @ 2021-05-01 13:48 UTC (permalink / raw) To: Bastien, Jean Louis; +Cc: help-gnu-emacs@gnu.org > I often find it difficult > to resist the temptation of noting something down *before* I know if > it is something I need to do or just something I need to remember to > check at some point, ending up with my to-do list presenting me with > to many things to do, some of them not really belonging here. > > Now I force myself to really ponder: "Do you really need to do it? > If not, do you want to remember it?" and I do this *before* I write > or capturing. To-do item 42,424,242: Start to figure out if I really need to do to-do item 31,425,936. To-do item 42,424,243: Start to figure out if I really need to do to-do item 42,424,242. ... ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [External] : Re: Org mode rant 2021-05-01 13:48 ` [External] : " Drew Adams @ 2021-05-01 14:05 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 0 replies; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-01 14:05 UTC (permalink / raw) To: help-gnu-emacs Drew Adams wrote: > To-do item 42,424,242: > > Start to figure out if I really need to do > to-do item 31,425,936. > > To-do item 42,424,243: > > Start to figure out if I really need to do > to-do item 42,424,242. When you notice an imperfection, do M-x todo RET two-or-three-technobabble-words-to-describe-it RET. When you view the TODO file some time later, if you still understand/remember what a technobabble oneliner refers to, that means do it or keep it (i.e., do nothing for the time being). Otherwise remove it has it was probably of very small importance even to you. -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Org mode rant 2021-05-01 9:16 ` Jean Louis 2021-05-01 10:06 ` Bastien 2021-05-01 10:10 ` Bastien @ 2021-05-01 10:10 ` Bastien 2 siblings, 0 replies; 72+ messages in thread From: Bastien @ 2021-05-01 10:10 UTC (permalink / raw) To: Jean Louis; +Cc: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: >> Now I suspect we are all very bad at using to-do lists. Why? > > Oops. Do you really think so? That's probably an exaggeration of mine, indeed. -- Bastien ^ permalink raw reply [flat|nested] 72+ messages in thread
* eval myths - Re: How to tame compiler? 2021-04-30 13:31 ` Jorge P. de Morais Neto 2021-04-30 19:38 ` rcd-template-eval - was " Jean Louis 2021-04-30 19:48 ` rcd-template-eval, much is in Org mode Jean Louis @ 2021-04-30 20:23 ` Jean Louis 2021-04-30 22:11 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 8:13 ` tomas 2021-04-30 22:06 ` Emanuel Berg via Users list for the GNU Emacs text editor 3 siblings, 2 replies; 72+ messages in thread From: Jean Louis @ 2021-04-30 20:23 UTC (permalink / raw) To: help-gnu-emacs * Jorge P. de Morais Neto <jorge+list@disroot.org> [2021-04-30 17:29]: > Hi all! > > Em [2021-04-22 qui 10:46:59-0400], Stefan Monnier escreveu: > > >> Is there a way to avoid these warnings? > > > > Yes: don't abuse `eval` ;-) > > Jean Louis, could you provide a little more detail on what are you using > ~eval~ for? Some tasks accomplished by eval can be done more safely by > other means. For example, if you just want symbol indirection, you can > use ~symbol-value~ (there is also ~symbol-function~). If you want to > apply a function object to a sequence of arguments, you can use ~apply~ > or ~funcall~. > > I know little about Elisp; more experienced hackers may know about other > mechanisms that avoid the need for ~eval~. Good read: https://en.wikipedia.org/wiki/Eval#Security_risks My eval-ing is equally dangerous as Org Babel evaling. If I write some destructive commands, well, it will be destructive. There is no special security risk there, as eval-ing does not take place online. But I could as well do it online, even then there need not be any security risk as I can tell which data goes into eval and decide not to include dynamic data, but currently I do not see any need for that. I could write text with eval-ing markup and have it interpolated by using Emacs on the fly, it would be pretty fast WWW publishing. Let us say I wish to say when is document last modified, I could just include: Last modified: ⟦ (last-modified) ⟧ and it would interpolate into time stamp of the file in question. Eval I use also in the nodes in the PostgreSQL database. I am thinking also to have various database types define for themselves their presentation or export functions. Right now I have Emacs hashes in the database. It is similar to properties in Org mode, though I have properties also as PostgreSQL array type. Some document entry could be saved in the hash, it expands PostgreSQL data type into something that Emacs understands, such hash has to be evaled. Let us say, I defined "Markdown Flavour X" as type, then the type could have its functions inside of itself in the database. That would be evaluated with eval and run. HTML could be generated, or some other program. Instead of hard coding it statically in a program, a remote or collaborative program could simply access the database by which access program would be extended, fetched from remote database and executed. Of course it gives to the remote resource full control about which program is there. But then there can be PGP signature for verification if necessary. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: eval myths - Re: How to tame compiler? 2021-04-30 20:23 ` eval myths - Re: How to tame compiler? Jean Louis @ 2021-04-30 22:11 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-04-30 23:07 ` Jean Louis 2021-05-01 8:13 ` tomas 1 sibling, 1 reply; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-04-30 22:11 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: > Good read: > https://en.wikipedia.org/wiki/Eval#Security_risks That's right, there are so many myths with that command. But what is the truth? -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: eval myths - Re: How to tame compiler? 2021-04-30 22:11 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-04-30 23:07 ` Jean Louis 2021-05-01 0:28 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 1 reply; 72+ messages in thread From: Jean Louis @ 2021-04-30 23:07 UTC (permalink / raw) To: help-gnu-emacs * Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> [2021-05-01 01:15]: > Jean Louis wrote: > > > Good read: > > https://en.wikipedia.org/wiki/Eval#Security_risks > > That's right, there are so many myths with that command. > But what is the truth? It is just one of useful functions. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: eval myths - Re: How to tame compiler? 2021-04-30 23:07 ` Jean Louis @ 2021-05-01 0:28 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 0 replies; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-01 0:28 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: >>> Good read: >>> https://en.wikipedia.org/wiki/Eval#Security_risks >> >> That's right, there are so many myths with that command. >> But what is the truth? > > It is just one of useful functions. Hahaha, let's put this in the docstring :) -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: eval myths - Re: How to tame compiler? 2021-04-30 20:23 ` eval myths - Re: How to tame compiler? Jean Louis 2021-04-30 22:11 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-01 8:13 ` tomas 1 sibling, 0 replies; 72+ messages in thread From: tomas @ 2021-05-01 8:13 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 3424 bytes --] On Fri, Apr 30, 2021 at 11:23:03PM +0300, Jean Louis wrote: > * Jorge P. de Morais Neto <jorge+list@disroot.org> [2021-04-30 17:29]: > > Hi all! > > > > Em [2021-04-22 qui 10:46:59-0400], Stefan Monnier escreveu: > > > > >> Is there a way to avoid these warnings? > > > > > > Yes: don't abuse `eval` ;-) > > > > Jean Louis, could you provide a little more detail on what are you using > > ~eval~ for? [...] > Good read: > https://en.wikipedia.org/wiki/Eval#Security_risks > > My eval-ing is equally dangerous as Org Babel evaling. If I write some > destructive commands, well, it will be destructive. Framing this from the security point of view to then deconstruct that frame leads up a blind alley. Actually, it's a kind of strawman [1] :-) Not that the security aspect isn't important. Actually, it has the potential to illustrate the underlying problem, but it is /not/ the underlying problem. What, for me, was elucidating was to try to think about what environment eval is supposed to "see". Imagine, in a lexical context, (let ((x 5)) (eval '(+ x 2))) [QUESTION TO THE EXPERTS] Why is this code (let ((x 5)) (eval '(+ x 2) t)) complaining "eval: Symbol’s value as variable is void: x" when I `C-x e' it in my scratch buffer? Yes, `lexical-binding' is t in the buffer [END OF QUESTION] Is eval supposed to "see" x? Now, if you have a compiler which does constant folding [0] ("ah, x, in this context /can/ only be 5, so we substitute its value in all expressions..."). Look up the documentation of `eval' in the Emacs Lisp manual for the path elisp has chosen. As soon as eval is involved, that is a bad plan. What if deep there in the eval, there is a (setq x 99)? Which isn't known at compile time, because... eval? So whenever there's an eval, the compiler has to drop nearly all its instruments. And this is bad :-) This is not really easy to grasp, but you'll always hear people who have done that tour (Stefan has!) to somewhat discourage the use of eval. Yes, it's there, is a tool, use it -- but it'll take you some time and a couple of scars until you fully master it. Usually, the problem you want to solve isn't nearly general enough to warrant the full eval. Put in other words: before you use eval, try to give an account of the full evaluation environment passed to it: `x' is bound to 5 (see above), `current-buffer' to some funny function, there is a function `strokes-describe-stroke' (did you know that one? I didn't)... and so on. There's that phrase "eval is evil" (I saw it first mentioned by Christian Queinnec in his book [2a], [2b]). You can use it conveniently in your search engine to see folks out there arguing the exact way you do and the answers given (most of the time it's javascript these days, because it's the language you get paid for currently, but the underlying problem is similar). Note that I have very little clue on all those things. Stefan has. If he says "think before eval", I'd strongly recommend doing some reading and experimenting. The journey could end up being panoramic :-) Cheers [0] https://en.wikipedia.org/wiki/Constant_folding [1] The kind I'd call "involuntary strawman". Security often has to play involuntary strawman. [2a] https://christian.queinnec.org/ [2b] https://christian.queinnec.org/WWW/LiSP.html -- t [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-04-30 13:31 ` Jorge P. de Morais Neto ` (2 preceding siblings ...) 2021-04-30 20:23 ` eval myths - Re: How to tame compiler? Jean Louis @ 2021-04-30 22:06 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-04-30 22:20 ` Stefan Monnier 3 siblings, 1 reply; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-04-30 22:06 UTC (permalink / raw) To: help-gnu-emacs Jorge P. de Morais Neto wrote: >>> Is there a way to avoid these warnings? >> >> Yes: don't abuse `eval` ;-) Stefan Monnier who wrote that last part, or anyone else for that matter, what is the rule of thumb when to and when not to use `eval'? Maybe something for the docstring? I have used eval 2 times in all my Elisp. If we apply the rule of thumb, what will that tell me, is that abuse or not? For the record I don't get any warnings from either. (defun wrap-search-again (&optional new-options) "Repeat the previous `wrap-search' with NEW-OPTIONS. NEW-OPTIONS can be supplied with \\[universal-argument]. Otherwise options from the previous search are used." (interactive "p") (let ((cmd (cl-find-if (lambda (c) (and (eq (car c) #'wrap-search) (not (string= (cl-caddr c) "")) )) command-history) )) (if cmd (if (= new-options 1) (eval cmd) (let*((search-str (cl-caddr cmd)) (final-cmd (list #'wrap-search new-options search-str)) ) (setq command-history (cons final-cmd command-history)) (apply final-cmd) )) (message "no previous search") ))) (defun do-repeat-complex-command () (interactive) (eval (car command-history) )) full source: https://dataswamp.org/~incal/emacs-init/ide/lisp-incal.el https://dataswamp.org/~incal/emacs-init/wrap-search.el -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-04-30 22:06 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-04-30 22:20 ` Stefan Monnier 2021-04-30 22:31 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 1 reply; 72+ messages in thread From: Stefan Monnier @ 2021-04-30 22:20 UTC (permalink / raw) To: help-gnu-emacs Emanuel Berg via Users list for the GNU Emacs text editor [2021-05-01 00:06:30] wrote: > Jorge P. de Morais Neto wrote: >>>> Is there a way to avoid these warnings? >>> Yes: don't abuse `eval` ;-) > Stefan Monnier who wrote that last part, or anyone else for > that matter, what is the rule of thumb when to and when not to > use `eval'? Use it only when you have to, otherwise don't use it. > (let ((cmd (cl-find-if (lambda (c) > (and (eq (car c) #'wrap-search) > (not (string= (cl-caddr c) "")) )) > command-history) )) > (if cmd > (if (= new-options 1) > (eval cmd) Here, as in your other example, you have to use `eval`, because `command-history` was defined to contain a list of ELisp expressions and those can't be used other than via `eval`. So I'll grant you a pass for this time. If you were in a position to control the format of history variable, then you wouldn't have to use `eval` here, OTOH: you could define that variable to hold a list of *functions* and you'd just use `funcall` instead of `eval`. Stefan ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-04-30 22:20 ` Stefan Monnier @ 2021-04-30 22:31 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-04-30 22:50 ` Stefan Monnier 0 siblings, 1 reply; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-04-30 22:31 UTC (permalink / raw) To: help-gnu-emacs Stefan Monnier wrote: > Here, as in your other example, you have to use `eval`, > because `command-history` was defined to contain a list of > ELisp expressions and those can't be used other than via > `eval`. > > So I'll grant you a pass for this time. > > If you were in a position to control the format of history > variable, then you wouldn't have to use `eval` here, OTOH: > you could define that variable to hold a list of *functions* > and you'd just use `funcall` instead of `eval`. OK, clear... -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-04-30 22:31 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-04-30 22:50 ` Stefan Monnier 2021-04-30 22:56 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 1 reply; 72+ messages in thread From: Stefan Monnier @ 2021-04-30 22:50 UTC (permalink / raw) To: help-gnu-emacs >> Here, as in your other example, you have to use `eval`, >> because `command-history` was defined to contain a list of >> ELisp expressions and those can't be used other than via >> `eval`. >> >> So I'll grant you a pass for this time. >> >> If you were in a position to control the format of history >> variable, then you wouldn't have to use `eval` here, OTOH: >> you could define that variable to hold a list of *functions* >> and you'd just use `funcall` instead of `eval`. > > OK, clear... Of course, you can't "search" for functions the way you do with the `cl-find-if`, and functions can't be printed in a user-friendly way, so there's a good reason for `command-history` not to contain just functions. So if you wanted to replace it with a history that can be used without `eval`, you'd probably make the new variable contain a list where every element is of the form (FUNCTION . ARGS), so that you'd replace `eval` with `apply`, and you'd recommend that the FUNCTION be a symbol rather than an anonymous function, to be sure that it can be compared and printed in a useful way. Stefan ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-04-30 22:50 ` Stefan Monnier @ 2021-04-30 22:56 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 0 replies; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-04-30 22:56 UTC (permalink / raw) To: help-gnu-emacs Stefan Monnier wrote: >>> Here, as in your other example, you have to use `eval`, >>> because `command-history` was defined to contain a list of >>> ELisp expressions and those can't be used other than via >>> `eval`. >>> >>> So I'll grant you a pass for this time. >>> >>> If you were in a position to control the format of history >>> variable, then you wouldn't have to use `eval` here, OTOH: >>> you could define that variable to hold a list of >>> *functions* and you'd just use `funcall` instead of >>> `eval`. >> >> OK, clear... > > Of course, you can't "search" for functions the way you do > with the `cl-find-if`, and functions can't be printed in > a user-friendly way, so there's a good reason for > `command-history` not to contain just functions. > > So if you wanted to replace it with a history that can be > used without `eval`, you'd probably make the new variable > contain a list where every element is of the form (FUNCTION > . ARGS), so that you'd replace `eval` with `apply`, and > you'd recommend that the FUNCTION be a symbol rather than an > anonymous function, to be sure that it can be compared and > printed in a useful way. Okay, no, we are using `eval' and it works. If someone says we shouldn't do it we say we do it because of the format of `command-history'. If they say anything more after that I don't feel we have to say anything. -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-04-22 14:43 How to tame compiler? Jean Louis 2021-04-22 14:46 ` Stefan Monnier @ 2021-05-01 0:44 ` Michael Heerdegen 2021-05-01 3:49 ` Stefan Monnier ` (2 more replies) 1 sibling, 3 replies; 72+ messages in thread From: Michael Heerdegen @ 2021-05-01 0:44 UTC (permalink / raw) To: Jean Louis; +Cc: Help GNU Emacs Jean Louis <bugs@gnu.support> writes: > As I have recently implemented new function that use `eval' to expand > various variables and these variables are not visibly used in the > program, I would like to tame the compiler, as I get these warnings: > > In rcd-send-email: > rcd-mailing.el:225:62: Warning: Unused lexical variable `unsubscribe-url' > rcd-mailing.el:231:21: Warning: Unused lexical variable `hello-name' > rcd-mailing.el:234:72: Warning: Unused lexical variable `unsubscribe-text' > rcd-mailing.el:252:11: Warning: Unused lexical variable `body' > > What is happening here is that those variables are used but inside of > `eval' form which is expanded dynamically when program runs. Compiler > cannot see that. > > Is there a way to avoid these warnings? Independent from the question whether your usage of `eval' is good or valid - there must be some real problem here: if the compiler tells that the lexical variables are unused, their values will not be available in you `eval' call - you would have to create dynamical bindings for that. Regards, Michael. ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-01 0:44 ` Michael Heerdegen @ 2021-05-01 3:49 ` Stefan Monnier 2021-05-01 4:55 ` Michael Heerdegen ` (2 more replies) 2021-05-01 4:53 ` Michael Heerdegen 2021-05-01 6:03 ` Jean Louis 2 siblings, 3 replies; 72+ messages in thread From: Stefan Monnier @ 2021-05-01 3:49 UTC (permalink / raw) To: help-gnu-emacs Michael Heerdegen [2021-05-01 02:44:16] wrote: > Jean Louis <bugs@gnu.support> writes: >> As I have recently implemented new function that use `eval' to expand >> various variables and these variables are not visibly used in the >> program, I would like to tame the compiler, as I get these warnings: >> >> In rcd-send-email: >> rcd-mailing.el:225:62: Warning: Unused lexical variable `unsubscribe-url' >> rcd-mailing.el:231:21: Warning: Unused lexical variable `hello-name' >> rcd-mailing.el:234:72: Warning: Unused lexical variable `unsubscribe-text' >> rcd-mailing.el:252:11: Warning: Unused lexical variable `body' >> >> What is happening here is that those variables are used but inside of >> `eval' form which is expanded dynamically when program runs. Compiler >> cannot see that. >> >> Is there a way to avoid these warnings? > > Independent from the question whether your usage of `eval' is good or > valid - there must be some real problem here: if the compiler tells that > the lexical variables are unused, their values will not be available in > you `eval' call - you would have to create dynamical bindings for that. I know I sound like a broken clock, but I think a better answer is to avoid `eval`: instead of taking expressions (that you'd pass to `eval`) arrange to receive functions (which you'd pass to `funcall` or `apply`). Then you can pass those functions the data they need (e.g. the value of things like `unsubscribe-text`). Stefan ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-01 3:49 ` Stefan Monnier @ 2021-05-01 4:55 ` Michael Heerdegen 2021-05-01 6:34 ` Jean Louis 2021-05-02 5:41 ` Michael Heerdegen 2 siblings, 0 replies; 72+ messages in thread From: Michael Heerdegen @ 2021-05-01 4:55 UTC (permalink / raw) To: help-gnu-emacs Stefan Monnier <monnier@iro.umontreal.ca> writes: > I know I sound like a broken clock, but I think a better answer is to > avoid `eval`: instead of taking expressions (that you'd pass to `eval`) > arrange to receive functions (which you'd pass to `funcall` or `apply`). > Then you can pass those functions the data they need (e.g. the value of > things like `unsubscribe-text`). How could that be implemented when he wants his templates to accept arbitrary Lisp code to be evaluated? Regards, Michael. ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-01 3:49 ` Stefan Monnier 2021-05-01 4:55 ` Michael Heerdegen @ 2021-05-01 6:34 ` Jean Louis 2021-05-01 13:38 ` Stefan Monnier 2021-05-02 5:41 ` Michael Heerdegen 2 siblings, 1 reply; 72+ messages in thread From: Jean Louis @ 2021-05-01 6:34 UTC (permalink / raw) To: Stefan Monnier; +Cc: help-gnu-emacs * Stefan Monnier <monnier@iro.umontreal.ca> [2021-05-01 06:50]: > > Independent from the question whether your usage of `eval' is good or > > valid - there must be some real problem here: if the compiler tells that > > the lexical variables are unused, their values will not be available in > > you `eval' call - you would have to create dynamical bindings for that. > > I know I sound like a broken clock, but I think a better answer is to > avoid `eval`: instead of taking expressions (that you'd pass to `eval`) > arrange to receive functions (which you'd pass to `funcall` or `apply`). > Then you can pass those functions the data they need (e.g. the value of > things like `unsubscribe-text`). I have to understand it in this example: The HTML template is following and it is string: <html> <head> <title>⟦ xml-escape title ⟧</title> </head> <body> <p>Today is one US dollar this many euros: ⟦ usd-eur 1 ⟧</p> </body> </html> > I know I sound like a broken clock, but I think a better answer is to > avoid `eval`: instead of taking expressions (that you'd pass to `eval`) > arrange to receive functions (which you'd pass to `funcall` or `apply`). > Then you can pass those functions the data they need (e.g. the value of > things like `unsubscribe-text`). Does that mean I should now extract maybe function `xml-escape' and use apply with rest of arguments? Maybe instead of: <title>⟦ xml-escape title ⟧</title> I should make: <title>⟦ xml-escape title ⟧</title> And then apply xml-escape with "title". Then I would convert first word into function, that somehow works, but all the remaining parts of string still need to be converted. How is program to know that things in a string are for example other variables or other Lisp functions? (let* ((lisp (buffer-substring-no-properties (1+ (match-beginning 0)) (1- (match-end 0)))) (lisp (split-string lisp)) (function (pop lisp)) (_ (message "%s" function)) (value (apply (intern function) lisp)) ;; I am stuck here (value (string-or-empty-string value))) For simplest use case like converting string to variable, or something like: ⟦ var hello-name ⟧ I think that would work, but then if I only use variables, I would not need "var" there, I could just interpolate it into variable without eval. For the case where there is even slightly complex Lisp like ⟦ (usd-eur (gold-price-kg)) ⟧ I would not know what to do there. Maybe it could look like: ⟦ usd-eur (gold-price-kg) ⟧ But then again program would receive string "(gold-price-kg)" and how would I know that string is another function? I would need to extract that string and basically make small Lisp reader, again we come to kind of eval-ing it. I want to know if there is way to do it. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-01 6:34 ` Jean Louis @ 2021-05-01 13:38 ` Stefan Monnier 2021-05-01 16:19 ` Jean Louis 0 siblings, 1 reply; 72+ messages in thread From: Stefan Monnier @ 2021-05-01 13:38 UTC (permalink / raw) To: help-gnu-emacs > I have to understand it in this example: > > The HTML template is following and it is string: > > <html> > <head> > <title>⟦ xml-escape title ⟧</title> > </head> > <body> > <p>Today is one US dollar this many euros: ⟦ usd-eur 1 ⟧</p> > </body> > </html> I think the way I'd attack this is similar to what was suggested recently. I think I'd introduce a macro (call it `xml-template`) which you'd use maybe as follows: (xml-template (html (head (title ,title)) (body (p "Today is one US dollar this many euros: " ,@(usd-eur 1))))) where `,` is used to insert a random chunk of plain text, whereas `,@` is used to insert a chunk of XML. Stefan ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-01 13:38 ` Stefan Monnier @ 2021-05-01 16:19 ` Jean Louis 0 siblings, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-05-01 16:19 UTC (permalink / raw) To: Stefan Monnier; +Cc: help-gnu-emacs * Stefan Monnier <monnier@iro.umontreal.ca> [2021-05-01 16:39]: > > I have to understand it in this example: > > > > The HTML template is following and it is string: > > > > <html> > > <head> > > <title>⟦ xml-escape title ⟧</title> > > </head> > > <body> > > <p>Today is one US dollar this many euros: ⟦ usd-eur 1 ⟧</p> > > </body> > > </html> > > I think the way I'd attack this is similar to what was suggested > recently. I think I'd introduce a macro (call it `xml-template`) which > you'd use maybe as follows: > > (xml-template > (html > (head (title ,title)) > (body (p "Today is one US dollar this many euros: " ,@(usd-eur 1))))) > > where `,` is used to insert a random chunk of plain text, > whereas `,@` is used to insert a chunk of XML. Approach is known to me from, is it Scribilo? https://www.nongnu.org/skribilo/ and Skribe https://www.nongnu.org/skribilo/#self I use similar approach for CGI document generation. My system does allow such inclusion as I can introduce any type of document. But let me think: - HTML template would need to be converted into sex-pressions; (don't stone me); it would increase the startup time of preparing the template, there are just 127 templates in the database; - then Markdown documents, what I do with it? Maybe all of 4057 should be converted into sex-pressions... with very careful attention to detail; - then Markdown is not any more Markdown, it would still need to be expanded by Emacs Lisp; - then everything expanded embedded into HTML as Emacs Lisp; Problems with the process: - it is not readable any more; - becomes tiresome, much more work is involved to write simple text; HTML template preparation alone involves programming skills; not easily scalable; - it becomes very much error prone, one mistake and all page will not interpolate; - author, who only slighly was thinking about the markup, has now to go back into thinking harder about the markup, instead of just writing text, author has to mark it up with (p "something") or similar; author is not any more in the "lightweight" markup as described here: https://en.wikipedia.org/wiki/Lightweight_markup_language That approach would be definitely usable for: - specific pages where large need arise for interpolation; - with complex code where a lot of interpolation is taking place -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-01 3:49 ` Stefan Monnier 2021-05-01 4:55 ` Michael Heerdegen 2021-05-01 6:34 ` Jean Louis @ 2021-05-02 5:41 ` Michael Heerdegen 2021-05-02 7:37 ` Jean Louis ` (3 more replies) 2 siblings, 4 replies; 72+ messages in thread From: Michael Heerdegen @ 2021-05-02 5:41 UTC (permalink / raw) To: help-gnu-emacs Stefan Monnier <monnier@iro.umontreal.ca> writes: > I know I sound like a broken clock, but [...] I think you would sound more like an unbroken clock if you would shortly tell the disadvantages of using `eval', then people would be more open to alternatives. Michael. ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-02 5:41 ` Michael Heerdegen @ 2021-05-02 7:37 ` Jean Louis 2021-05-02 7:45 ` Jean Louis ` (2 subsequent siblings) 3 siblings, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-05-02 7:37 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2021-05-02 08:43]: > Stefan Monnier <monnier@iro.umontreal.ca> writes: > > > I know I sound like a broken clock, but [...] > > I think you would sound more like an unbroken clock if you would shortly > tell the disadvantages of using `eval', then people would be more open > to alternatives. I have now just isolated the `rcd-template-eval' function into separate package without `lexical-binding' and it works well: https://hyperscope.link/3/7/1/3/3/RCD-Template-Interpolation-System-for-Emacs.html This is one special case where lexical-binding should be nil, as me, I wish to be able to expand any variables in the template. I could use `lexical-binding t' to see maybe some compiler errors, but then I have removed it. Of course I have heard of dangers of using `eval' in various programming languages. But we have to put it in the specific contexts as we do use `eval' so many times. Example is Org mode source blocks, eval is used there, including it is used to evaluate other or any kind of language. And people publish Org mode documents after doing eval. Just same thing is taking place here. The RCD Template Interpolation system uses `eval' to expand the embedded Emacs Lisp into text. It is just same as using Org mode with source blocks to expand Emacs Lisp or other programming languages into text. Just as with writing text, I could accidently write my passwords and publish them online, or I could accidentaly or unknowingly remove all my files with `rm -rf /home/myhome' -- and I remember doing that first time when I met MS-DOS, but command name maybe was different, who cares. When `eval' is used with parameters that arrive from website visitor, that is where one should be careful maybe to escape the parameters and make sure there is nothing that could disturb or be malicious. Of course one should not `eval' the parameter rather accept strings and process strings. I guess hundreds of not thousands of people already publish Org files that have such embedded programming languages eval-ed and expanded, and now such Org files are published online. What I am doing here is the same as Org, just that I like to use any kind of markup to pre-process it before the conversion into HTML. Back in time I have been testing various templating systems with Perl, and I found this one was the fastest: https://metacpan.org/pod/Text::NeatTemplate because I have tested all templating systems on thousands page expansions and found that one being fastest, I used it for years. One can see how variables are being carefully prepared to be passed to the function. And there are many similar templating systems used for HTML generation. Then I have been using for another bunch of years the CL-EMB Common Lisp templating system: https://40ants.com/lisp-project-of-the-day/2020/09/0192-cl-emb.html https://www.common-lisp.net/project/cl-emb/ I think CL-EMB does not use `eval' directly but it uses `read-from-string' and macro to expand the values. Anything can take place there, as it is equivalent to eval, any code can be placed in the text, and of course somebody can insert malicious code and do something bad. Let us say I make system in the functional style, that I don't write plain text but rather Lisp expressions like (html (p "Something")) then it is also open to inserting malicious code there, it is even easier to insert malicious code into the code as it camouflages itself, then inserting malicious code into the plain text. People like to use embedded programming languages: https://github.com/dbohdan/embedded-scripting-languages There are many web template systems: https://en.wikipedia.org/wiki/Web_template_system And those hyperlinks demonstrate the demand for that. Maybe not many people generate HTML pages or emails with Emacs Lisp, but I need it. I have SMS communication, email communication, letters, and I like expanding templates on the fly. When working with 1500+ people, it brings better understanding if I send SMS which expands into personalized messages: Hello John, I have not get answer on my message to you from 4th May, did you read it? You still have US $150 pending with us. What really matters? - that I can send mass SMS communication, hire people and engage them on projects; - that I can use templating system to send hundreds of thousands of emails and thus close sales, as they are personalized; - that I can use both HTML pages with embedded personalization for emails; send HTML pages, it appears personalized, or publish it, it is not personalized, with dynamically expanded values, such as prices, listings of products, and similar; -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-02 5:41 ` Michael Heerdegen 2021-05-02 7:37 ` Jean Louis @ 2021-05-02 7:45 ` Jean Louis 2021-05-02 9:06 ` tomas 2021-05-02 16:45 ` How to tame compiler? Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-02 22:29 ` Stefan Monnier 3 siblings, 1 reply; 72+ messages in thread From: Jean Louis @ 2021-05-02 7:45 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs * Michael Heerdegen <michael_heerdegen@web.de> [2021-05-02 08:43]: > Stefan Monnier <monnier@iro.umontreal.ca> writes: > > > I know I sound like a broken clock, but [...] > > I think you would sound more like an unbroken clock if you would shortly > tell the disadvantages of using `eval', then people would be more open > to alternatives. If possible, let me know one bad example in my context of expanding plain text with embedded Emacs Lisp. Like how it can go wrong that in same time cannot go wrong in same replacement method? And which replacement method could I use? Like why did Lisp authors the `read-from-string' function if it should not be used? It is quite common that its result will be given to `eval'. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-02 7:45 ` Jean Louis @ 2021-05-02 9:06 ` tomas 2021-05-02 11:18 ` Jean Louis 2021-05-02 12:06 ` Stages of WWW development compared to Emacs Lisp development Jean Louis 0 siblings, 2 replies; 72+ messages in thread From: tomas @ 2021-05-02 9:06 UTC (permalink / raw) To: Michael Heerdegen, help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 1848 bytes --] On Sun, May 02, 2021 at 10:45:10AM +0300, Jean Louis wrote: > * Michael Heerdegen <michael_heerdegen@web.de> [2021-05-02 08:43]: > > Stefan Monnier <monnier@iro.umontreal.ca> writes: > > > > > I know I sound like a broken clock, but [...] > > > > I think you would sound more like an unbroken clock if you would shortly > > tell the disadvantages of using `eval', then people would be more open > > to alternatives. > > If possible, let me know one bad example in my context of expanding > plain text with embedded Emacs Lisp. I tried to offer an explanation which you chose to ignore [1] . I think the problem is more subtle, and thus difficult to explain in just a few words. If it were that easy to explain clearly, I think Stefan would have done that already. > Like how it can go wrong that in same time cannot go wrong in same > replacement method? > > And which replacement method could I use? > > Like why did Lisp authors the `read-from-string' function if it should > not be used? It is quite common that its result will be given to `eval'. It's not as clear-cut as "should not be used". Rather something along the lines of "should be used with care" [2]. Template expansion is one of those borderline cases, but if you look at all those modern template expanders out there [3], you'll realise that they all have some kind of "custom evaluator", where you explicitly provide an environment, instead of just punting to `eval' and saying "use... uh, whatever". For a reason [4]. Cheers [1] Which, to be honest, is somewhat confusing to me. [2] Yes, do it: enter the phrase "eval is evil" into your favourite search engine. [3] e.g. Perl's Text::Template, Python's Jinja2, you name it. [4] Perhaps one short way to express it would be "this havocs the compiler". Dunno. - t [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-02 9:06 ` tomas @ 2021-05-02 11:18 ` Jean Louis 2021-05-02 12:24 ` tomas 2021-05-02 12:06 ` Stages of WWW development compared to Emacs Lisp development Jean Louis 1 sibling, 1 reply; 72+ messages in thread From: Jean Louis @ 2021-05-02 11:18 UTC (permalink / raw) To: tomas; +Cc: Michael Heerdegen, help-gnu-emacs * tomas@tuxteam.de <tomas@tuxteam.de> [2021-05-02 12:08]: > On Sun, May 02, 2021 at 10:45:10AM +0300, Jean Louis wrote: > > * Michael Heerdegen <michael_heerdegen@web.de> [2021-05-02 08:43]: > > > Stefan Monnier <monnier@iro.umontreal.ca> writes: > > > > > > > I know I sound like a broken clock, but [...] > > > > > > I think you would sound more like an unbroken clock if you would shortly > > > tell the disadvantages of using `eval', then people would be more open > > > to alternatives. > > > > If possible, let me know one bad example in my context of expanding > > plain text with embedded Emacs Lisp. > > I tried to offer an explanation which you chose to ignore [1] . I > think the problem is more subtle, and thus difficult to explain in > just a few words. As I am asking questions it is demonstration that I am not ignoring it. In background I am running business, so the templating engine does help me, it works, I have sent now quite number of messages to people. But in foreground, here, I am interested for any kinds of suggestions. It is not the option to change text to sex-pressions, as that would cause way too much work and minimize collaborative capacity, as that demands teaching people not only how to write text, but how to write kind of Lisp. Purpose of it is to interpolate values into text, to pre-process text or templates. Usually both are pre-processed, the text first, then text and variables are interpolated into the template. It could be for letters, it could be like for LaTeX or other markup, mostly HTML, emails and SMS message. Related keywords are "web template system" and "templating engines": https://en.wikipedia.org/wiki/Web_template_system https://en.wikipedia.org/wiki/Comparison_of_web_template_engines It is by the same principle as: - Org Babel, which uses `eval' - Emacs Muse. Both are used for publishing. > > Like how it can go wrong that in same time cannot go wrong in same > > replacement method? > > > > And which replacement method could I use? > > > > Like why did Lisp authors the `read-from-string' function if it should > > not be used? It is quite common that its result will be given to `eval'. > > It's not as clear-cut as "should not be used". Rather something along > the lines of "should be used with care" [2]. It may be evil, just that I don't find practical evilness, but I would like one simple example how it can be evil. IMHO, functions are here, if you see something wrong with it, let me know. It is in a package that does not have lexical-binding t, and it is one particular case where it should stay so, as I wish to interpolate any variables. One problem I had is with (match-beginning 0) and (match-end (match-end 0)) as with some functions it would not work, maybe because `eval' was using it deeply somewhere. That is why I have captured the values in `let': (let* ((match-beginning (match-beginning 0)) (match-end (match-end 0)) as otherwise it would not be able to: (delete-region (match-beginning 0) (match-end 0)) that is why this works: (delete-region match-beginning match-end) with captured values. If you see something else, let me know. (defcustom rcd-template-delimiter-open "⟦" "The opening delimiter for RCD Template Interpolation System." :group 'rcd :type 'string) (defcustom rcd-template-delimiter-close "⟧" "The closing delimiter for RCD Template Interpolation System." :group 'rcd :type 'string) (defun rcd-template-eval (string &optional delimiters) "Evaluates Emacs Lisp enclosed by `rcd-template-delimiter-open' and `rcd-template-delimiter-close'. Optional DELIMITERS list may be provided to change default delimiters, first list member has to be the opening delimiter and second the closing delimiter. Space or new line has to follow `rcd-template-delimiter-open' and precede `rcd-template-delimiter-close' for evaluation to get invoked." (let* ((delimiters (or delimiters (list rcd-template-delimiter-open rcd-template-delimiter-close))) (open (car delimiters)) (close (cadr delimiters)) (add (length open)) (minus (length close))) (with-temp-buffer (insert string) (goto-char 0) (while (re-search-forward (rx (literal open) (one-or-more (or blank "\n")) (group (minimal-match (one-or-more anything))) (one-or-more (or blank "\n")) (literal close)) nil t) (let* ((match-beginning (match-beginning 0)) (match-end (match-end 0)) (lisp (condition-case nil (read-from-string (buffer-substring-no-properties (+ add match-beginning) (- match-end minus))) (error ""))) (lisp (if (listp lisp) (car lisp) lisp)) (value (condition-case nil (eval lisp) (error ""))) (value (cond ((null value) "") (t (format "%s" value))))) (delete-region match-beginning match-end) (insert (format "%s" value)))) (buffer-string)))) (defun rcd-template-buffer-preview () (interactive) (let* ((current (current-buffer)) (buffer (format "Preview of buffer %s" current)) (string (buffer-string)) (mode major-mode) (point (point))) (pop-to-buffer-same-window buffer) (insert (rcd-template-eval string)) (goto-char point) (funcall mode) (message buffer))) (defun rcd-template-insert-delimiters () "Quickly insert the template evaluation snippet such as ⟦ () ⟧ and move cursor into parenthesis." (interactive) (insert (format "%s () %s" rcd-template-delimiter-open rcd-template-delimiter-close)) (backward-char (+ 2 (length rcd-template-delimiter-close)))) > Template expansion is one of those borderline cases, but if you look > at all those modern template expanders out there [3], you'll realise > that they all have some kind of "custom evaluator", where you > explicitly provide an environment, instead of just punting to `eval' > and saying "use... uh, whatever". For string expansion they will provide environment and "manually" replace some words into provided alist for example. CL-EMB in Common Lisp uses `read-from-string'. So far I see the use of it and I used it years before, just with Common Lisp. Here is one example page with its source that uses `rcd-template-eval': https://hyperscope.link/3/7/1/3/6/Emacs-Lisp-interpolation-of-embedded-PostgreSQL-queries-within-plain-text.html Purpose of it is to give liberation to HTML, SMS, email templates and make static HTML pages kind of dynamic, as some dynamically generated data can be expanded before publishing HTML pages. I understand so far: - there are opposing arguments to `eval', but... - there is no replacement for `eval' in the context of templates with programming code; or other contexts; - `eval' is already heavily used in Org mode and Muse, so many other large number packages; Those contradictions are confusing. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-02 11:18 ` Jean Louis @ 2021-05-02 12:24 ` tomas 2021-05-02 18:17 ` Jean Louis 0 siblings, 1 reply; 72+ messages in thread From: tomas @ 2021-05-02 12:24 UTC (permalink / raw) To: Michael Heerdegen, help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 4171 bytes --] On Sun, May 02, 2021 at 02:18:23PM +0300, Jean Louis wrote: > * tomas@tuxteam.de <tomas@tuxteam.de> [2021-05-02 12:08]: [...] > > I tried to offer an explanation which you chose to ignore [1] . I > > think the problem is more subtle, and thus difficult to explain in > > just a few words. > > As I am asking questions it is demonstration that I am not ignoring > it. In background I am running business, so the templating engine does > help me, it works, I have sent now quite number of messages to > people. But in foreground, here, I am interested for any kinds of > suggestions. Well, I offered a suggestion. Write your limited version of eval, which makes available the substitutions (values or functions) you intend to use in your template, for example in a dictionary (aka hash). That's what other templating systems do, even in languages which do have eval (that's why I provided examples in Perl and Python). > It is not the option to change text to sex-pressions, as that would > cause way too much work and minimize collaborative capacity, as that > demands teaching people not only how to write text, but how to write > kind of Lisp. The S-expression proposal is orthogonal to the problem at hand. That's why I didn't propose it (although it does have some advantages of its own). > Purpose of it is to interpolate values into text, to pre-process text > or templates. Usually both are pre-processed, the text first, then > text and variables are interpolated into the template. It could be for > letters, it could be like for LaTeX or other markup, mostly HTML, > emails and SMS message. [...] > > It's not as clear-cut as "should not be used". Rather something along > > the lines of "should be used with care" [2]. > > It may be evil, just that I don't find practical evilness, but I would > like one simple example how it can be evil. It's too subtle to be covered by "just one simple example", that's why I proposed you do some research. > IMHO, functions are here, if you see something wrong with it, let me > know. It is in a package that does not have lexical-binding t, and it > is one particular case where it should stay so, as I wish to > interpolate any variables. [...] I haven't the time to go through your code, sorry. > > Template expansion is one of those borderline cases, but if you look > > at all those modern template expanders out there [3], you'll realise > > that they all have some kind of "custom evaluator", where you > > explicitly provide an environment, instead of just punting to `eval' > > and saying "use... uh, whatever". > > For string expansion they will provide environment and "manually" > replace some words into provided alist for example. CL-EMB in Common > Lisp uses `read-from-string'. > > So far I see the use of it and I used it years before, just with > Common Lisp. > > Here is one example page with its source that uses `rcd-template-eval': > > https://hyperscope.link/3/7/1/3/6/Emacs-Lisp-interpolation-of-embedded-PostgreSQL-queries-within-plain-text.html > > Purpose of it is to give liberation to HTML, SMS, email templates and > make static HTML pages kind of dynamic, as some dynamically generated > data can be expanded before publishing HTML pages. > > I understand so far: > > - there are opposing arguments to `eval', but... Let me put that this way: to do a good job, the compiler makes assumptions on things like variable bindings ("this variable can only be seen in this part of the code I analysed right now"). When an eval is in the middle of things, the compiler can't "see through": the code therein can change at run time. All bets are off. Just imagine a (let ((x 5) ...) and then an eval whithin that with a form (setq x 6). > - there is no replacement for `eval' in the context of templates with > programming code; or other contexts; There is. See my examples. > - `eval' is already heavily used in Org mode and Muse, so many other > large number packages; > > Those contradictions are confusing. Because the topic is not that simple :) Cheers - t [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-02 12:24 ` tomas @ 2021-05-02 18:17 ` Jean Louis 0 siblings, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-05-02 18:17 UTC (permalink / raw) To: tomas; +Cc: Michael Heerdegen, help-gnu-emacs * tomas@tuxteam.de <tomas@tuxteam.de> [2021-05-02 15:25]: > Well, I offered a suggestion. Write your limited version of eval, > which makes available the substitutions (values or functions) > you intend to use in your template, for example in a dictionary > (aka hash). That's what other templating systems do, even in > languages which do have eval (that's why I provided examples in > Perl and Python). I did use that for years. The new approach seem so much simpler and liberating, it lessens the work. > The S-expression proposal is orthogonal to the problem at hand. > That's why I didn't propose it (although it does have some advantages > of its own). As my system supports any type of markup, I can include that as well. Again I would be reading it with `read-from-string' straight from the database, and then using `eval'. S-expression text has to be stored somewhere, right? It has to be loaded from somewhere, so majority would be loading it from file I guess, I am loading it from the database and again I have to use `eval'. The purpose not to use `eval' defeats itself how I see it as I have to use `eval'. Let us say database table is named: pages, there is column pages_text, if it contains string like "(p \"Hello there\")" -- I have to `read-from-string` and `eval' or maybe there exists some other way? What would you do? Would you load it from file? I am thinking, what would be the difference of loading it from file, or using `eval', I cannot find the difference, I wish I could. > It's too subtle to be covered by "just one simple example", that's why > I proposed you do some research. I did that research years ago. Do we have any practical use of declining to use specific function without being able to tell why? On the other hand, thousands of people use `eval' in Org mode as a good example, and not for Emacs Lisp only. If we wish to remedy the situation we would need maybe to find safer `eval' but before finding safer `eval' we have to know why exactly is this one not safe as compared to whatever proposed replacement methods. > > I understand so far: > > > > - there are opposing arguments to `eval', but... > > Let me put that this way: to do a good job, the compiler makes > assumptions on things like variable bindings ("this variable can > only be seen in this part of the code I analysed right now"). When > an eval is in the middle of things, the compiler can't "see > through": the code therein can change at run time. All bets are off. I understand, compiler will not be able to see through. > Just imagine a (let ((x 5) ...) and then an eval whithin that with > a form (setq x 6). Good example, thank you. That would be `eval' within a program. My `eval' takes place within a text. It does not necessarily change program, I do not know if it would be possible, I can try. (let ((variable "Gully") (my-value 0) (template "⟦ variable ⟧ ⟦ (setq my-value 1) ⟧")) (rcd-template-eval template)) ⇒ "Gully 1" Now I can see that I can change program values from within `eval' in the template. On the other hand, I can change values also within the program. The safety is thus in the decision making of authors, not in `eval' itself. > > - there is no replacement for `eval' in the context of templates with > > programming code; or other contexts; > > There is. See my examples. Do you mean example of passing a hash? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Stages of WWW development compared to Emacs Lisp development 2021-05-02 9:06 ` tomas 2021-05-02 11:18 ` Jean Louis @ 2021-05-02 12:06 ` Jean Louis 2021-05-02 16:51 ` Emanuel Berg via Users list for the GNU Emacs text editor 1 sibling, 1 reply; 72+ messages in thread From: Jean Louis @ 2021-05-02 12:06 UTC (permalink / raw) To: tomas; +Cc: Michael Heerdegen, help-gnu-emacs As in the context of templating engines, WWW development is very similar to Emacs Lisp development or any programming language. One has to try it out, there are maybe some trials and errors, there is debugging involved, preview or testing, editing, preview or testing, until it becomes what author wants it to be. One bad example that I can think of in using `read-from-string' and `eval' in templates is when strings from visitor's input would be processed with it. For example, if visitor would be asked for email, and that email address is then, instead of obtained from environment like POST, processed by `read-from-string' -- at this moment I would not know why it should be so, unless website wants to evaluate some programming code. There are today so many websites evaluating programming code in browser. Who knows how secure they are... By principle, I do not keep the database online, at least privacy is ensured. Attacker on a website could eventually send spam or use some band width, but nothing more than that. The comparison of web templating engines shows that many of them are using "functions": https://en.wikipedia.org/wiki/Comparison_of_web_template_engines I see that Perl's Template Toolkit probably uses `eval': https://github.com/abw/Template2/search?q=eval&type= In this list for Python templating engines, two of them are mentioned using `eval' I rather think there are more than two: https://wiki.python.org/moin/Templating Or this Tiny Template, that says not to use `eval' but it is restricted in operation: https://github.com/yuanchuan/tiny-template And my intention is not to be restricted in operation. I was doing for years preparation of variables, etc. so that I can pass it to the templating engine like CL-EMB, but I think that was more because of Common Lisp nature of packages, I would need to call functions with their prefixes. Global variables were anyway present, and I could anyway evaluate any Common Lisp code in CL-EMB. From CL-EMB: - `<% ... %>` is a scriptlet tag, and wraps Common Lisp code. - `<%= ... %>` is an expression tag. Its content gets evaluated and fed as a parameter to `(FORMAT T "~A" ...)`. - `<%# ... #%>` is a comment. Everything within will be removed/ignored. Can't be nested! I have just minimized it to the system that can use various delimiters, including just parenthesis (would the remaining text not use parenthesis with spaces): ( anything ) would be evaluated while (anything) would not. And I can skip the CL-EMB's tag <%= something %> into ( something ) or ⟦ something ⟧ and I skip using complex tags like <% @var VARIABLE %> as ⟦ VARIABLE ⟧ will work or expand empty. In CL-EMB there are some template tags, while any Lisp can be embedded anyway: Currently supported: `@if`, `@else`, `@endif`, `@ifnotempty`, `@unless`, `@endunless`, `@var`, `@repeat`, `@endrepeat`, `@loop`, `@endloop`, `@include`, `@includevar`, `@call`, `@with`, `@endwith`, `@set`, `@genloop`, `@endgenloop`, `@insert`. It is more complex templating engine, one can have separate chunks of embedded templating tags which then work together with the mixed text inside, great, but also complex. It mixes 2 languages, one is templating language and one is Lisp. Instead, why not just use Lisp. Process of preparing pages for evaluation is simple: - edit page - preview - edit and preview until satisfied - publish In that sense whatever can go wrong with sex-pression templates or Scribe style of preparation, it can also go wrong with `eval' based templating engine. Muse can embed any kind of Emacs Lisp and anyway does not have good visualization of it. Org mode embeds any kind of programming. I am using Org mode and expanding it from outside of Emacs by using Common Lisp which invokes Emacs each time, and I guess that makes things slower. If I manage the Website Revision System directly from Emacs, it will be somewhat faster to expand Org blobs from database. Following Common Lisp is used to convert stream of Org data to Markdown markup: $ cat file.org | pipe-org-to-markdown.lisp #!/home/data1/protected/bin/lisp (defparameter memdir "/dev/shm/") (defparameter tmp-file "rcd-wrs-XXXXXX") (defparameter tmp-org (format nil "~a~a.org" memdir tmp-file)) (defparameter tmp-md (format nil "~a~a.md" memdir tmp-file)) ;;(delete-file tmp-org) ;;(delete-file tmp-md) (load "/home/data1/protected/Programming/git/RCDBusiness/lib/lisp/streamtools.lisp") ;; (require "syscalls") (defparameter org-autoloads.el (concatenate 'string (namestring (car (directory "/home/data1/protected/.emacs.d/elpa/org-20??????/"))) "org-autoloads.el")) (defun main () (let ((input '()) (output '())) (with-open-file (out tmp-org :direction :output :external-format "utf-8" :if-exists :supersede) (loop for line = (read-line *standard-input* nil nil) while line do (write-line line out))) (shell (format nil "emacs -Q -l ~a \"~a\" --batch -f org-mode -f org-md-export-to-markdown --kill" org-autoloads.el tmp-org)) (setf output (with-open-file (stream tmp-md :direction :input :external-format "utf-8") (loop for line = (read-line stream nil nil) while line collect line))) (setf output (format nil "~{~a~^~%~}" output)) (setf output (slurp-stream-io-command "markdown -F 0x4" output)) (princ output)) (exit)) ;; ;; (saveinitmem "org2html" :quiet t :init-function 'main :verbose nil :norc t :documentation "Converts Org standard input into markdown" :executable t) (main) -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Stages of WWW development compared to Emacs Lisp development 2021-05-02 12:06 ` Stages of WWW development compared to Emacs Lisp development Jean Louis @ 2021-05-02 16:51 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-02 18:37 ` Jean Louis 0 siblings, 1 reply; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-02 16:51 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: > As in the context of templating engines, WWW development is > very similar to Emacs Lisp development or any > programming language. Well... > One has to try it out, there are maybe some trials and > errors, there is debugging involved, preview or testing, > editing, preview or testing, until it becomes what author > wants it to be. ... rather I'd say what you describe holds for everything that is difficult to do, almost. > (concatenate ? > (loop for line = (read-line > while line do > (write-line ??? > (slurp-stream-io-command > (saveinitmem Where you get all this stuff? -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: Stages of WWW development compared to Emacs Lisp development 2021-05-02 16:51 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-02 18:37 ` Jean Louis 0 siblings, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-05-02 18:37 UTC (permalink / raw) To: help-gnu-emacs * Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> [2021-05-02 19:53]: > Jean Louis wrote: > > > As in the context of templating engines, WWW development is > > very similar to Emacs Lisp development or any > > programming language. > > Well... > > > One has to try it out, there are maybe some trials and > > errors, there is debugging involved, preview or testing, > > editing, preview or testing, until it becomes what author > > wants it to be. > > ... rather I'd say what you describe holds for everything that > is difficult to do, almost. > > > (concatenate > > ? > > > (loop for line = (read-line > > while line do > > (write-line I don't use it anymore, that is not from me, at least not currently. > ??? > > > (slurp-stream-io-command > > (saveinitmem > > Where you get all this stuff? Isn't that Common Lisp? (require "asdf") (defun slurp-stream-io-command (command string) "Returns the output of a command to which string has been fed, very usable for markdown, emacs Org mode processing and similar" (with-input-from-string (in string) (uiop:run-program command :input in :output :string :ignore-error-status t))) (slurp-stream-io-command "markdown" "## hello") "<h2>hello</h2> " -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-02 5:41 ` Michael Heerdegen 2021-05-02 7:37 ` Jean Louis 2021-05-02 7:45 ` Jean Louis @ 2021-05-02 16:45 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-02 22:29 ` Stefan Monnier 3 siblings, 0 replies; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-02 16:45 UTC (permalink / raw) To: help-gnu-emacs Michael Heerdegen wrote: > I think you would sound more like an unbroken clock if you > would shortly tell the disadvantages of using `eval', then > people would be more open to alternatives. That would be an even better clock yes... -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-02 5:41 ` Michael Heerdegen ` (2 preceding siblings ...) 2021-05-02 16:45 ` How to tame compiler? Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-02 22:29 ` Stefan Monnier 2021-05-02 23:14 ` Jean Louis 3 siblings, 1 reply; 72+ messages in thread From: Stefan Monnier @ 2021-05-02 22:29 UTC (permalink / raw) To: help-gnu-emacs >> I know I sound like a broken clock, but [...] > I think you would sound more like an unbroken clock if you would shortly > tell the disadvantages of using `eval', then people would be more open > to alternatives. Code always starts in the form of a string somewhere, i.e. data, and somewhere along the lines it gets transformed into something that can be executed, i.e. code. `eval` is one way to do that, but it's a quite restrictive, because it doesn't give any opportunity to do something useful with the data representation of the code before we run it. I.e. it makes it hard to compile the code to make it more efficient, it makes it virtually impossible to give feedback about problems in the code (except for those problems which lead to "hard errors"), and for the same reason it makes it hard to provide any other kind of help in writing the code (like code completion). In the current context of Emacs, places that use `eval` tend to presume that variables have names and that those names are significant, i.e. they presume dynamic scoping, and for the same reason that it's hard to provide feedback about problems in code that is passed to `eval` it's very hard (both for tools and for humans) to figure out what needs to be done in order for the code to work correctly in the lexical-scoped dialect of ELisp. Stefan ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-02 22:29 ` Stefan Monnier @ 2021-05-02 23:14 ` Jean Louis 2021-05-03 1:58 ` Eduardo Ochs 0 siblings, 1 reply; 72+ messages in thread From: Jean Louis @ 2021-05-02 23:14 UTC (permalink / raw) To: Stefan Monnier; +Cc: help-gnu-emacs * Stefan Monnier <monnier@iro.umontreal.ca> [2021-05-03 01:30]: > >> I know I sound like a broken clock, but [...] > > I think you would sound more like an unbroken clock if you would shortly > > tell the disadvantages of using `eval', then people would be more open > > to alternatives. > > Code always starts in the form of a string somewhere, i.e. data, and > somewhere along the lines it gets transformed into something that can be > executed, i.e. code. > > `eval` is one way to do that, but it's a quite restrictive, because it > doesn't give any opportunity to do something useful with the data > representation of the code before we run it. I.e. it makes it hard to > compile the code to make it more efficient, it makes it virtually > impossible to give feedback about problems in the code (except for those > problems which lead to "hard errors"), and for the same reason it makes > it hard to provide any other kind of help in writing the code (like code > completion). > > In the current context of Emacs, places that use `eval` tend to presume > that variables have names and that those names are significant, > i.e. they presume dynamic scoping, and for the same reason that it's > hard to provide feedback about problems in code that is passed to `eval` > it's very hard (both for tools and for humans) to figure out what needs > to be done in order for the code to work correctly in the lexical-scoped > dialect of ELisp. > > > Stefan Thank you. I agree with compiler issues. In the context of template expansion, would there be some larger program and they are in background somewhat larger, those programs or functions may and do reside in packages with lexical scoping, rather for verification of the code. When certain function runs well, they are proven and they may be then embedded into the text. It could be as simple as: ⟦ (sql "SELECT count(1) FROM people") ⟧ or ⟦ (clisp-macro (princ (format nil "~R" (expt 2 50)))) ⟧ Those are usually smaller snippets that are verified outside of the text template beforehand, and previewed before publishing. If anything goes wrong, they may evaluate to empty string and continue with parsing of the text. Previewer may decide if function works or not, basically, if the text is ready to be published or not. Would there be larger or more complex code, then such can be invoked beforehand in form of a report, or file, and its result could be included into the page by one of the methods. In general the embedded Emacs Lisp will never be used or installed as a package, neither byte compiled or otherwise verified for correctness as how we usually do it with Emacs Lisp files. It is one of multiple programming paradigms of Lisp. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-02 23:14 ` Jean Louis @ 2021-05-03 1:58 ` Eduardo Ochs 2021-05-03 6:51 ` Eval in templates - " Jean Louis 0 siblings, 1 reply; 72+ messages in thread From: Eduardo Ochs @ 2021-05-03 1:58 UTC (permalink / raw) To: help-gnu-emacs On Sun, 2 May 2021 at 20:32, Jean Louis <bugs@gnu.support> wrote: > > * Stefan Monnier <monnier@iro.umontreal.ca> [2021-05-03 01:30]: > > >> I know I sound like a broken clock, but [...] > > > I think you would sound more like an unbroken clock if you would shortly > > > tell the disadvantages of using `eval', then people would be more open > > > to alternatives. > > > > Code always starts in the form of a string somewhere, i.e. data, and > > somewhere along the lines it gets transformed into something that can be > > executed, i.e. code. > > > > `eval` is one way to do that, but it's a quite restrictive, because it > > doesn't give any opportunity to do something useful with the data > > representation of the code before we run it. I.e. it makes it hard to > > compile the code to make it more efficient, it makes it virtually > > impossible to give feedback about problems in the code (except for those > > problems which lead to "hard errors"), and for the same reason it makes > > it hard to provide any other kind of help in writing the code (like code > > completion). > > > > In the current context of Emacs, places that use `eval` tend to presume > > that variables have names and that those names are significant, > > i.e. they presume dynamic scoping, and for the same reason that it's > > hard to provide feedback about problems in code that is passed to `eval` > > it's very hard (both for tools and for humans) to figure out what needs > > to be done in order for the code to work correctly in the lexical-scoped > > dialect of ELisp. > > > > > > Stefan > > Thank you. I agree with compiler issues. > > In the context of template expansion, would there be some larger > program and they are in background somewhat larger, those programs or > functions may and do reside in packages with lexical scoping, rather > for verification of the code. When certain function runs well, they > are proven and they may be then embedded into the text. It could be as > simple as: > > ⟦ (sql "SELECT count(1) FROM people") ⟧ > > or > > ⟦ (clisp-macro (princ (format nil "~R" (expt 2 50)))) ⟧ > > Those are usually smaller snippets that are verified outside of the > text template beforehand, and previewed before publishing. If anything > goes wrong, they may evaluate to empty string and continue with > parsing of the text. Previewer may decide if function works or not, > basically, if the text is ready to be published or not. > > Would there be larger or more complex code, then such can be invoked > beforehand in form of a report, or file, and its result could be > included into the page by one of the methods. In general the embedded > Emacs Lisp will never be used or installed as a package, neither byte > compiled or otherwise verified for correctness as how we usually do it > with Emacs Lisp files. > > It is one of multiple programming paradigms of Lisp. > > > > -- > Jean Hi Jean-Louis, just as a curiosity, here is how eev implements template interpolation: http://angg.twu.net/eev-current/eev-template0.el.html http://angg.twu.net/eev-current/eev-template0.el I tried several other implementations of template interpolation functions before that one, and from time to time I would find another way that would be both simpler and more powerful than the previous one... the one above is so simple that in one of the times that I gave a minicourse on LaTeX and Emacs I followed the code of `ee-template0' with the students in the third day of the minicourse - one day after teaching them briefly how to understand code with `defun's and `let's. My trick to handle lexical binding was to tell the students that dynamic binding is much easier to understand than lexical binding, and that they should treat dynamic binding as an advanced topic that would make more sense when they had at least one week of experience with Emacs - and my minicourse was only five days long, from monday to friday... but the students in that minicourse were mathematicians with little experience in programming, not compsci people who would see immediately that dynamic binding is "wrong". Cheers =), Eduardo Ochs http://angg.twu.net/#eev ^ permalink raw reply [flat|nested] 72+ messages in thread
* Eval in templates - Re: How to tame compiler? 2021-05-03 1:58 ` Eduardo Ochs @ 2021-05-03 6:51 ` Jean Louis 0 siblings, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-05-03 6:51 UTC (permalink / raw) To: Eduardo Ochs; +Cc: help-gnu-emacs * Eduardo Ochs <eduardoochs@gmail.com> [2021-05-03 04:59]: > just as a curiosity, here is how eev implements template > interpolation: > > http://angg.twu.net/eev-current/eev-template0.el.html > http://angg.twu.net/eev-current/eev-template0.el > > I tried several other implementations of template interpolation > functions before that one, and from time to time I would find another > way that would be both simpler and more powerful than the previous > one... the one above is so simple that in one of the times that I gave > a minicourse on LaTeX and Emacs I followed the code of `ee-template0' > with the students in the third day of the minicourse - one day after > teaching them briefly how to understand code with `defun's and > `let's. That is so interesting. This templating system has slightly different concept. In my eval-ing, I have to get some value no matter what, I am also thinking I have freedom to make errors, to the system is not allowed to fail. (setq rcd-template-delimiter-open "(") ⇒ "(" (setq rcd-template-delimiter-close ")") ⇒ ")" (setq text1 "We will evaluate (+ 2 2) to result ((+ 2 2))") ;; won't interpolate (setq text2 "We will evaluate (+ 2 2) to result ( (+ 2 2) )") (setq text3 "We will evaluate (+ 2 2) to result ( (+ 2 2 )") ;; error allowed This does not interpolate, as I demand spaces after delimiters: (rcd-template-eval text1) ⇒ "We will evaluate (+ 2 2) to result ((+ 2 2))" This does interpolate: (rcd-template-eval text2) ⇒ "We will evaluate (+ 2 2) to result 4" Error is interpolated to "", but I could log it in future: (rcd-template-eval text3) ⇒ "We will evaluate (+ 2 2) to result " Compared to this that works: (ee-template0 "{<} a{(+ 2 3)} {>}") ⇒ "{ a5 }" And this one giving error: (ee-template0 "{<} a{(+ 2 3} {>}") Concept is the same. You also do not use dynamic binding, which is quite clear why. In the sense of teaching is fine. I guess you almost never had a problem when evaluation fails for some reason. In the sense of generation of hundreds of emails for people, or generation of thousands of HTML pages, the template system IMHO is not allowed to fail. Errors however, could be reported, templating system could then tell me in which page or email the error has been found. But it has to move silently over the failure. Thus I would expect also this one, to produce following: (ee-template0 "{<} a{(+ 2 3} {>}") ⇒ "{ a }" And more perfect would be if error would be reported somewhere in silent. > My trick to handle lexical binding was to tell the students that > dynamic binding is much easier to understand than lexical binding, and > that they should treat dynamic binding as an advanced topic that would > make more sense when they had at least one week of experience with > Emacs - and my minicourse was only five days long, from monday to > friday... but the students in that minicourse were mathematicians with > little experience in programming, not compsci people who would see > immediately that dynamic binding is "wrong". Thus you had the luck to have a different type of audience. Here is also demonstrated how eev tools have different context, programs are invoked from within text manuall. Your tools are in general, beyond templating, meant to be evaluated in the text or within the text and in that concept there is also no need for lexical binding. Small snippets are evaluated one after each other by user's demand, functions evaluated may come originally from programs with lexical binding. Thus I have improved my function to evalute with errors reported, as it makes so much more sense. It is made to interpolate thousands of times within minutes automatically. Source: https://gnu.support/files/sources/rcd-template.el (defun rcd-template-eval (string &optional delimiters) "Evaluates Emacs Lisp enclosed by `rcd-template-delimiter-open' and `rcd-template-delimiter-close'. Optional DELIMITERS list may be provided to change default delimiters, first list member has to be the opening delimiter and second the closing delimiter. Space or new line has to follow `rcd-template-delimiter-open' and precede `rcd-template-delimiter-close' for evaluation to get invoked." (let* ((delimiters (or delimiters (list rcd-template-delimiter-open rcd-template-delimiter-close))) (open (car delimiters)) (close (cadr delimiters)) (add (length open)) (minus (length close))) (with-temp-buffer (insert string) (goto-char 0) (while (re-search-forward (rx (literal open) (one-or-more (or blank "\n")) (group (minimal-match (one-or-more anything))) (one-or-more (or blank "\n")) (literal close)) nil t) (let* ((match-beginning (match-beginning 0)) (match-end (match-end 0)) (match (buffer-substring-no-properties (+ add match-beginning) (- match-end minus))) (lisp (condition-case error (read-from-string match) (error (princ (format "rcd-template-eval: `read-from-string' error: %s" error)) ""))) (lisp (if (listp lisp) (car lisp) lisp)) (value (condition-case error (eval lisp) (error (princ (format "rcd-template-eval: `eval' error: %s" error))))) (value (cond ((null value) "") (t (format "%s" value))))) (delete-region match-beginning match-end) (insert (format "%s" value)))) (buffer-string)))) (rcd-template-eval "( (+ 2 2) )" '("(" ")")) ⇒ "4" (rcd-template-eval "( (+ 2 2 )" '("(" ")")) ⇒ "" with error reporting in *Messages* buffer: rcd-template-eval: `read-from-string' error: (end-of-file) (rcd-template-eval "We expect 4 but fail: ( (+2 2) )" '("(" ")")) ⇒ "We expect 4 but fail: " with error reporting in *Messages* buffer: rcd-template-eval: `eval' error: (invalid-function 2) (defun ee-template-test (text) (rcd-template-eval text '("{" "}"))) My regexp asks for spaces or new lines between delimiters: (ee-template-test "{<} a{ (+ 2 3 } {>}") ⇒ "{<} a {>}" with error reporting in *Messages* buffer: rcd-template-eval: `read-from-string' error: (end-of-file) but of course, it does not do your trick: (ee-template-test "{<} a{ (+ 2 3) } {>}") ⇒ "{<} a5 {>}" If I would like to enclose it with open delimiters in a result, this would work: (ee-template-test "{ \"{\" } a{ (+ 2 3) } { \"}\" }") ⇒ "{ a5 }" And I use the habit that people would not tend to write space after parenthesis. I could write: (maybe I am wrong), but I would never write ( maybe I am not wrong ). That may allow using parenthesis in templates which makes it more Lisp-like: (rcd-template-eval "We know that (+ 2 2) evaluates to ( (+ 2 2) )") ⇒ "We know that (+ 2 2) evaluates to 4" Then `eval' within `eval' help in avoiding repetition of demonstrated code: (rcd-template-eval "We know that ( (setq code '(+ 2 2)) ) evaluates to ( (eval code) )") ⇒ "We know that (+ 2 2) evaluates to 4" Regular expression is I see hard coded: (defvar ee-template00-re "{\\([^{}]+\\)}") And I have envisioned it to rather have flexible delimiters: (rcd-template-eval "<% user-login-name %>" '("<%" "%>")) ⇒ "jimmy" as it emulates some other templating engines and allows re-use of templates: (rcd-template-eval "<% @var user-login-name %>" '("<% @var" "%>")) ⇒ "jimmy" Maybe you wish to include error reporting and silent failure as well, or no? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-01 0:44 ` Michael Heerdegen 2021-05-01 3:49 ` Stefan Monnier @ 2021-05-01 4:53 ` Michael Heerdegen 2021-05-01 7:05 ` Jean Louis 2021-05-01 6:03 ` Jean Louis 2 siblings, 1 reply; 72+ messages in thread From: Michael Heerdegen @ 2021-05-01 4:53 UTC (permalink / raw) To: help-gnu-emacs Michael Heerdegen <michael_heerdegen@web.de> writes: > you would have to create dynamical bindings for that. Oh, you could also use the second argument of `eval' to specify a lexical environment. That would also help to get rid of the warnings. Michael. ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-01 4:53 ` Michael Heerdegen @ 2021-05-01 7:05 ` Jean Louis 2021-05-01 7:59 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 1 reply; 72+ messages in thread From: Jean Louis @ 2021-05-01 7:05 UTC (permalink / raw) To: Michael Heerdegen; +Cc: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 1610 bytes --] * Michael Heerdegen <michael_heerdegen@web.de> [2021-05-01 07:54]: > Michael Heerdegen <michael_heerdegen@web.de> writes: > > > you would have to create dynamical bindings for that. > > Oh, you could also use the second argument of `eval' to specify a > lexical environment. That would also help to get rid of the > warnings. How I understand it, I would need to use dynamical bindings, but in smallest example with lexical-binding t on the top of file, it does not work. So I do not know how to use dynamical bindings. As function `rcd-template-eval' is in other file, when I provide `t' to (eval) in that other file, that still gives warnings in the file where variables are used, and then it will not expand. I have lost control. My program works, but it should not work. In fact if I remove: (ignore "Avoid compiler warnings" to-name hello-name body unsubscribe-text unsubscribe-url) than nothing works, and template does not get expanded, probably because of lexical bindings. (eval) I use without t If I comment `ignore' or I do not use ignore, it stops working, and nothing expands. If I do use ignore as above, it does work. But in the smallest example as in attached files, it does not work. Maybe it is some bug, and program works due to bug. I cannot bring it to minimum example, it just works, exactly how it is in these attached exampled (which don't work). -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ [-- Attachment #2: test.el --] [-- Type: text/plain, Size: 370 bytes --] ;; -*- lexical-binding: t; -*- ;; (add-to-list 'load-path "~/Programming/emacs-lisp") (require 'rcd-template) (defun my-fun () (let* ((hello-name "Joe") ;; (lexical-binding nil) (template "⟦ hello-name ⟧") (expanded-body (rcd-template-eval template))) (ignore "Avoid compiler warnings" hello-name template) (message "%s" expanded-body))) (my-fun) [-- Attachment #3: rcd-template.el --] [-- Type: text/plain, Size: 2126 bytes --] ;;; rcd-template.el --- template ;; -*- lexical-binding: t; -*- ;;; Commentary: ;; ;;; Code: (defvar rcd-template-delimiter-open "⟦") (defvar rcd-template-delimiter-close "⟧") (defun rcd-template-eval (string &optional delimiters) "Evaluates Emacs Lisp enclosed by `rcd-template-delimiter-open' and `rcd-template-delimiter-close'. Optional DELIMITERS list may be provided to change default delimiters, first list member has to be the opening delimiter and second the closing delimiter. Space or new line has to follow `rcd-template-delimiter-open' and precede `rcd-template-delimiter-close' for evaluation to get invoked." (let* ((delimiters (or delimiters (list rcd-template-delimiter-open rcd-template-delimiter-close))) (open (car delimiters)) (close (cadr delimiters))) (with-temp-buffer (insert string) (goto-char 0) (while (re-search-forward (rx (literal open) (one-or-more (or blank "\n")) (group (minimal-match (one-or-more anything))) (one-or-more (or blank "\n")) (literal close)) nil t) ;;(message "Found match") (let* ((lisp (car (read-from-string (buffer-substring-no-properties (1+ (match-beginning 0)) (1- (match-end 0)))))) (value (condition-case nil (eval lisp) (error ""))) (value (string-or-empty-string value))) ;; (message "HELLO: %s" (eval (format "%s" hello-name))) (delete-region (match-beginning 0) (match-end 0)) (insert (format "%s" value)))) (buffer-string)))) (defun rcd-template-buffer-eval () (interactive) (let* ((buffer (buffer-string)) (mode major-mode) (point (point))) (pop-to-buffer-same-window "Preview") (insert (rcd-template-eval buffer)) (goto-char point) (funcall mode) (espeak "Preview"))) (defun string-or-empty-string (i) "Returns empty string for nil" (let* ((type (type-of i))) (cond ((or (eql type 'integer) (eql type 'float)) (number-to-string i)) ((null i) "") ((eql type 'symbol) (prin1-to-string i)) ((eql type 'string) i)))) (provide 'rcd-template) ;;; rcd-template.el ends here ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-01 7:05 ` Jean Louis @ 2021-05-01 7:59 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 0 replies; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-01 7:59 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: > So I do not know how to use dynamical bindings Even more reason not to do it... -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-01 0:44 ` Michael Heerdegen 2021-05-01 3:49 ` Stefan Monnier 2021-05-01 4:53 ` Michael Heerdegen @ 2021-05-01 6:03 ` Jean Louis 2021-05-01 6:17 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-02 5:58 ` Michael Heerdegen 2 siblings, 2 replies; 72+ messages in thread From: Jean Louis @ 2021-05-01 6:03 UTC (permalink / raw) To: Michael Heerdegen; +Cc: Help GNU Emacs * Michael Heerdegen <michael_heerdegen@web.de> [2021-05-01 03:44]: > Jean Louis <bugs@gnu.support> writes: > > > As I have recently implemented new function that use `eval' to expand > > various variables and these variables are not visibly used in the > > program, I would like to tame the compiler, as I get these warnings: > > > > In rcd-send-email: > > rcd-mailing.el:225:62: Warning: Unused lexical variable `unsubscribe-url' > > rcd-mailing.el:231:21: Warning: Unused lexical variable `hello-name' > > rcd-mailing.el:234:72: Warning: Unused lexical variable `unsubscribe-text' > > rcd-mailing.el:252:11: Warning: Unused lexical variable `body' > > > > What is happening here is that those variables are used but inside of > > `eval' form which is expanded dynamically when program runs. Compiler > > cannot see that. > > > > Is there a way to avoid these warnings? > > Independent from the question whether your usage of `eval' is good or > valid - there must be some real problem here: if the compiler tells that > the lexical variables are unused, their values will not be available in > you `eval' call - you would have to create dynamical bindings for > that. How do I go to create dynamical bindings? Help me. This file works: (let* ((hello-name "Joe") (template "⟦ hello-name ⟧") (expanded (rcd-template-eval template))) expanded) ⇒ "Joe" while this one does not work: ;; -*- lexical-binding: t; -*- (let* ((hello-name "Joe") (template "⟦ hello-name ⟧") (expanded (rcd-template-eval template))) expanded) ⇒ "" and to make it work I did this: ;; -*- lexical-binding: t; -*- (let* ((hello-name "Joe") (template "⟦ hello-name ⟧") (lexical-binding nil) (expanded (rcd-template-eval template))) expanded) (ignore 'hello-name) however, that simple example does not work, but what is astonishing I have sent 900+ emails yesterday and they were expanded just fine. The file test.el with above code is not working. My file with lexical-binding: t is working. I am using it and I do not know why it does work. Without (lexical-binding nil) it did not work. It seems I have to use that to make it work, but in smallest example it does not. Maybe it is something completely else. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-01 6:03 ` Jean Louis @ 2021-05-01 6:17 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-02 5:58 ` Michael Heerdegen 1 sibling, 0 replies; 72+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-01 6:17 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: > How do I go to create dynamical bindings? Help me. Lexical is much better, so put ;; -*- lexical-binding: t; -*- in the beginning (first line) of every file including ~/.emacs -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-01 6:03 ` Jean Louis 2021-05-01 6:17 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-02 5:58 ` Michael Heerdegen 2021-05-02 6:54 ` Jean Louis 2021-05-03 21:39 ` Jean Louis 1 sibling, 2 replies; 72+ messages in thread From: Michael Heerdegen @ 2021-05-02 5:58 UTC (permalink / raw) To: Help GNU Emacs Jean Louis <bugs@gnu.support> writes: > How do I go to create dynamical bindings? Help me. Newest Emacs versions have `dlet' to create dynamical bindings. Here is the definition: #+begin_src emacs-lisp (defmacro dlet (binders &rest body) "Like `let*' but using dynamic scoping." (declare (indent 1) (debug let)) `(let (_) ,@(mapcar (lambda (binder) `(defvar ,(if (consp binder) (car binder) binder))) binders) (let* ,binders ,@body))) #+end_src Use that macro to create dynamical bindings where you really need, and rely on lexical binding else. Apart from that, I recommend to take Stefan's suggestions into consideration, he knows what he is talking about. Regards, Michael. ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-02 5:58 ` Michael Heerdegen @ 2021-05-02 6:54 ` Jean Louis 2021-05-03 21:39 ` Jean Louis 1 sibling, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-05-02 6:54 UTC (permalink / raw) To: Michael Heerdegen; +Cc: Help GNU Emacs * Michael Heerdegen <michael_heerdegen@web.de> [2021-05-02 08:59]: > Jean Louis <bugs@gnu.support> writes: > > > How do I go to create dynamical bindings? Help me. > > Newest Emacs versions have `dlet' to create dynamical bindings. Here is > the definition: > > #+begin_src emacs-lisp > (defmacro dlet (binders &rest body) > "Like `let*' but using dynamic scoping." > (declare (indent 1) (debug let)) > `(let (_) > ,@(mapcar (lambda (binder) > `(defvar ,(if (consp binder) (car binder) binder))) > binders) > (let* ,binders ,@body))) > #+end_src > > Use that macro to create dynamical bindings where you really need, and > rely on lexical binding else. > > Apart from that, I recommend to take Stefan's suggestions into > consideration, he knows what he is talking about. Thankful for dlet tip! It would help if I wish to expand few variables dynamically bound. Though I found the solution for `rcd-template-eval' as I want global variables, I am simply not using lexical-binding t in the package. All I had to do is to isolate the function for template evaluation into separate package without lexical-binding and now there are no problems whatsoever, interpolation works well. It is here: https://hyperscope.link/3/7/1/3/3/RCD-Template-Interpolation-System-for-Emacs.html -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: How to tame compiler? 2021-05-02 5:58 ` Michael Heerdegen 2021-05-02 6:54 ` Jean Louis @ 2021-05-03 21:39 ` Jean Louis 1 sibling, 0 replies; 72+ messages in thread From: Jean Louis @ 2021-05-03 21:39 UTC (permalink / raw) To: Michael Heerdegen; +Cc: Help GNU Emacs * Michael Heerdegen <michael_heerdegen@web.de> [2021-05-02 08:59]: > Jean Louis <bugs@gnu.support> writes: > > > How do I go to create dynamical bindings? Help me. > > Newest Emacs versions have `dlet' to create dynamical bindings. Here is > the definition: > > #+begin_src emacs-lisp > (defmacro dlet (binders &rest body) > "Like `let*' but using dynamic scoping." > (declare (indent 1) (debug let)) > `(let (_) > ,@(mapcar (lambda (binder) > `(defvar ,(if (consp binder) (car binder) binder))) > binders) > (let* ,binders ,@body))) > #+end_src > > Use that macro to create dynamical bindings where you really need, and > rely on lexical binding else. That really helped me, or I would be lost today. As my `rcd-template-eval' function did work, but somehow, for unknown reasons as indicated already by developers, it started misbehaving, and variables sometimes interpolated, sometimes not, or maybe at second invokation not. And I had to enclose the variables in the function within `dlet' and now it works well. But I have to tame compiler... This function can now generate thousands of pages, pre-process it, process with Markdown, Asciidoctor, txt2tags, Org mode, or however, page is written (or not process...) and produce the output. I guess it is very inefficient. Important is that it works. (defun wrs-generate-page (page-id) (dlet ((page (rcd-db-table-id-hash "pages" page-id cf-db)) (area (rcd-db-table-id-hash "areas" (gethash "pages_area" page) cf-db)) (template (rcd-db-table-id-hash "templates" (or (gethash "pages_templates" page) (gethash "areas_template" area)) cf-db)) (pages_title (gethash "pages_title" page)) (pages_keywords (gethash "pages_keywords" page)) (pages_description (gethash "pages_description" page)) (variables (make-hash-table :test 'equal)) (_ (hash-append variables (wrs-variables-hash nil nil nil 3))) (_ (hash-append variables (wrs-variables-hash (gethash "pages_area" page)))) (_ (hash-append variables (wrs-variables-hash nil (gethash "templates_id" template)))) (language (rcd-db-get-entry "languages" "languages_extension" (or (gethash "pages_language" page) (gethash "areas_defaultlanguage" area)) cf-db)) (_ (puthash "languages_extension" language variables)) (_ (when (gethash "areas_company" area) (puthash "areas_company" (rcd-db-get-entry "accounts" "accounts_name" (gethash "areas_company" area) cf-db) variables))) (_ (hash-append variables page area template)) (text (rcd-template-eval (gethash "pages_content" page "") '("⟦" "⟧") variables)) (processor (gethash "templates_processor" template)) (text (wrs-process-text processor text)) (_ (puthash "pages_content" text variables)) (template (gethash "templates_content" template)) (open-graph-type "Article") (html (rcd-template-eval template '("⟦" "⟧") variables)) (local-file (wrs-page-url page-id t))) (string-to-file-force html local-file))) -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/ ^ permalink raw reply [flat|nested] 72+ messages in thread
end of thread, other threads:[~2021-05-04 2:39 UTC | newest] Thread overview: 72+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-04-22 14:43 How to tame compiler? Jean Louis 2021-04-22 14:46 ` Stefan Monnier 2021-04-22 15:47 ` Jean Louis 2021-04-22 16:06 ` Jean Louis 2021-04-30 13:31 ` Jorge P. de Morais Neto 2021-04-30 19:38 ` rcd-template-eval - was " Jean Louis 2021-04-30 19:48 ` rcd-template-eval, much is in Org mode Jean Louis 2021-04-30 20:06 ` Tassilo Horn 2021-04-30 22:08 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-04-30 23:04 ` Org mode rant Jean Louis 2021-05-01 0:46 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 6:10 ` Jean Louis 2021-05-01 6:34 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 9:41 ` On markdown images Jean Louis 2021-05-01 9:59 ` Yuri Khan 2021-05-01 10:18 ` Jean Louis 2021-05-01 11:09 ` Yuri Khan 2021-05-01 11:25 ` Jean Louis 2021-05-02 19:30 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-03 5:43 ` Yuri Khan 2021-05-03 17:08 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-03 23:22 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-04 2:39 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 5:00 ` Org mode rant Bastien 2021-05-01 5:10 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 9:16 ` Jean Louis 2021-05-01 10:06 ` Bastien 2021-05-01 10:42 ` Jean Louis 2021-05-01 10:10 ` Bastien 2021-05-01 11:19 ` Jean Louis 2021-05-01 13:48 ` [External] : " Drew Adams 2021-05-01 14:05 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 10:10 ` Bastien 2021-04-30 20:23 ` eval myths - Re: How to tame compiler? Jean Louis 2021-04-30 22:11 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-04-30 23:07 ` Jean Louis 2021-05-01 0:28 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 8:13 ` tomas 2021-04-30 22:06 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-04-30 22:20 ` Stefan Monnier 2021-04-30 22:31 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-04-30 22:50 ` Stefan Monnier 2021-04-30 22:56 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 0:44 ` Michael Heerdegen 2021-05-01 3:49 ` Stefan Monnier 2021-05-01 4:55 ` Michael Heerdegen 2021-05-01 6:34 ` Jean Louis 2021-05-01 13:38 ` Stefan Monnier 2021-05-01 16:19 ` Jean Louis 2021-05-02 5:41 ` Michael Heerdegen 2021-05-02 7:37 ` Jean Louis 2021-05-02 7:45 ` Jean Louis 2021-05-02 9:06 ` tomas 2021-05-02 11:18 ` Jean Louis 2021-05-02 12:24 ` tomas 2021-05-02 18:17 ` Jean Louis 2021-05-02 12:06 ` Stages of WWW development compared to Emacs Lisp development Jean Louis 2021-05-02 16:51 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-02 18:37 ` Jean Louis 2021-05-02 16:45 ` How to tame compiler? Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-02 22:29 ` Stefan Monnier 2021-05-02 23:14 ` Jean Louis 2021-05-03 1:58 ` Eduardo Ochs 2021-05-03 6:51 ` Eval in templates - " Jean Louis 2021-05-01 4:53 ` Michael Heerdegen 2021-05-01 7:05 ` Jean Louis 2021-05-01 7:59 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-01 6:03 ` Jean Louis 2021-05-01 6:17 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-05-02 5:58 ` Michael Heerdegen 2021-05-02 6:54 ` Jean Louis 2021-05-03 21:39 ` Jean Louis
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).