* Christmas wish: Literate Elisp @ 2019-12-12 15:45 arthur miller 2019-12-12 17:29 ` Stefan Monnier 2019-12-14 4:16 ` Richard Stallman 0 siblings, 2 replies; 45+ messages in thread From: arthur miller @ 2019-12-12 15:45 UTC (permalink / raw) To: emacs-devel [-- Attachment #1: Type: text/plain, Size: 7643 bytes --] Hello, I have a question/proposal about Elisp and literate programming. Well, more of a proposal then a question, but here it is: From Wikipedia: "Literate programming is a programming paradigm introduced by Donald Knuth in which a computer program is given an explanation of its logic in a natural language, such as English, interspersed with snippets of macros and traditional source code, from which compilable source code can be generated." Emacs already supports a form of literal programming in form of org mode and babel where we can insert code for programming languages in-between #+BEGIN_SRC and #+END_SRC markers, which is super nice and cool feature. However I got a thought that LISPs (lisp-like languages), have natural code markers, since all code is enclosed with parenthesis. Thus one could see '(' and ')' as code markers in literate-programming style, more of as Knuth proposed. In other words, LISP (or at least Elisp) does not need special markers to denote start and end of code. Unlike Haskell, there is no need to use '\begin_code' or '>' to differentiate code from text (comments). My proposal is to slightly change Elisp parser to treat lines that start with any other printable character but '(' as a start of comment and to simply ignore the line, just as it treats ';' as a comment. Code blocks would still be parsed as they are now, and ';' would still mean a comment, wherever it is encountered, it is just that anything that does not belong in a code-block (lists) is a comment. For example consider this mail, if this would be thrown into parser all lines to this point would be simply ignored since they don't start with '(' or are white spaces. (my-elisp-fun (progn (while (very-cool) (do-something-very-literate-here)))) Then I could have Elisp code in between and continue to write this mail and later on just use this as a source code. Wouldn't that be a step toward true and more cool literate programming language? Below is another snippet of imaginary Elisp. If we could do this, then this email would be a working literate Elisp, where those two snippets are code and text of this mail is just ignored. (my-other-fun (progn ; this-is-some-other-fun (to-hopefully-demonstrate-the-idea))) What would this achieve More then highly increased coolness factor, it would be a small quality of life improvement. For example this would actually make it slightly easier to use org-mode for Elisp programming. For example for us that use org-mode to structure Emacs init file, we could just throw in our org file directly, instead of using babel to entangle it into Elisp file first. If every printable character but '(' starts a comment line, then everything in org-file but Elisp code would be simply ignored, and only Elisp executed. If we think other way around, it would also let us use pure Elisp for literate programming without org-mode whatsoever, albeit it would be a cool feature to use org-headings and similar to structure the code. It might make code more structured and thus more readable. When I think in terms of Elisp as a starting point rather then in terms of org-mode as a starting point, that could result in adding org-mode organizational features directly to Elisp. One could even mark say not-implemented functions as todo items, use calendar etc. We could also entangle other languages within pure Elisp code without using org mode whatsoever. Either within some code markers for processing them out to separate files, or without code markers just as documentation or whatever. I don't have some better example of use-case at the moment. I don't mean that it is incredibly slow to entangle files, but it would be slightly more efficient to process Elisp entangled in org mode. I also don't think it is hard to type ';' at the beginning of a line to start a comment line. But it is a small convenience and thus quality of life improvement that probably does not need much changes to a parser but has quite a dramatic effect on how source code looks in human eye (at least mine, if you don't mind that I count myself as a part of the species :-)). It would let us use org-mode as a standard Elisp source code format, which might be just a perceived convenience rather then some real extra useful thing that does not exist yet. Some thoughts about implementation I think that in terms of cost effectiveness with implementation in mind, it probably isn't that much work to implement this, but honestly I have no idea. I believe it can't be much work, but I am not sure so I should really put an exclamation mark to word probably in paragraph above. Feel free to educate me about cost of making it work. I was looking myself in C source to see if I could test this myself before I post here, but I couldn't find where you have implemented parser. I am sorry, but I am that bad :-(. Essentially when parsing literate Elisp, if I may call it so, what parser has to do is to simply not flag random printable characters, on lines that does not belong to code-blocks, as errors in source code. Instead just treat them as if it has seen a ';'. It means there are just two classes of printable characters: '(' that opens a code block, and everything else that opens a comment block. Well almost. Parsing code blocks would not need to be changed at all, and ';' in code blocks would still mean that rest of line is a comment, and all code with comments would still continue to work as it does now. It would only affect new code that is written in this style. However new Elisp code wouldn't be backward compatible with old versions of Emacs. As extra, one could keep current Elisp parser and make new one and use as in Haskell, en extra 'l' in suffix to denote a literate program, '.lel'. Though it kind-a looks fun, I don't think it wouldn't be needed, I don't think this change would need different parser, to ensure backward compatibility. I don't think that is very important since if we would write Elisp that needs to run on older versions, we can just let be to write it in literal form. Drawbacks As I can think of, it would maybe make spotting errors slightly harder, for example I could type a random character before an opening parenthesis and comment out entire line, but those kind of errors are easily spotted on first code run. Another drawback would be probably syntax highlighting. It could probably become much harder to detect comments in code since there is no ';' to mark a comment-line. Maybe I am wrong about this one, it is just a fast thought. Final thought I have no idea if somebody else has already thought about this and found that it can't work. It seems like a very straight-forward and simple thing so I am probably not the first one to think the thought, and there is probably some reason why it is not done that I am not aware of. In that case just ignore this email. It was just a thought I got yesterday. There might be something I am not aware of that makes this impossible, I am not that familiar with Emacs source to try to implement this myself unfortunately. It is just an idea, a thought for discussion, but it would be cool if it can work. I am sorry for very long email, I hope you have at least somewhat enjoyed my rather ramblings and Christmas wishes, and please ask Santa to excuse my English, I am not native English speaker, it is just my 3rd language if it is in any defense or my horrible writing. [-- Attachment #2: Type: text/html, Size: 11030 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Christmas wish: Literate Elisp 2019-12-12 15:45 Christmas wish: Literate Elisp arthur miller @ 2019-12-12 17:29 ` Stefan Monnier 2019-12-14 4:40 ` Sv: " arthur miller 2019-12-20 16:51 ` Phillip Lord 2019-12-14 4:16 ` Richard Stallman 1 sibling, 2 replies; 45+ messages in thread From: Stefan Monnier @ 2019-12-12 17:29 UTC (permalink / raw) To: arthur miller; +Cc: archambv, emacs-devel > My proposal is to slightly change Elisp parser to treat lines that start > with any other printable character but '(' as a start of comment and to > simply ignore the line, just as it treats ';' as a comment. The `sexpresso` Haskell package follows the same idea ;-) As for using it in Elisp: I don't think there's anything stopping anyone from making such a `literate-elisp-mode` and even arrange for `load` to handle such a file (just like there is already a package that lets `load` work directly on .org files). I'd welcome such a package in GNU ELPA. Stefan ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Christmas wish: Literate Elisp 2019-12-12 17:29 ` Stefan Monnier @ 2019-12-14 4:40 ` arthur miller 2019-12-14 14:08 ` Stefan Monnier 2019-12-20 16:51 ` Phillip Lord 1 sibling, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-14 4:40 UTC (permalink / raw) To: Stefan Monnier; +Cc: archambv@iro.umontreal.ca, emacs-devel [-- Attachment #1: Type: text/plain, Size: 1622 bytes --] To be honest my contact with Haskell broke once the university course, some 20 yrs ago was over, so I am a little bit illiterate about Haskells sexy packages. I just recalled that it was possible to invert text and code in Haskell. But cool. Didn't know there is a package to let load org files directly either. What I do in init is use org-babel to entangle my init file (org-babel-load-file (expand-file-name "~/.emacs.d/lisp/init.org")). What is the name of the package? I have tried to google it and looked into elpa packages with list-package but I don't see it. I am just curious how is it done, as I was thinking or they refactor the code as in org-babel into corresponding lisp file. Thanks for the answers. ________________________________ Från: Stefan Monnier <monnier@iro.umontreal.ca> Skickat: den 12 december 2019 18:29 Till: arthur miller <arthur.miller@live.com> Kopia: emacs-devel <emacs-devel@gnu.org>; archambv@iro.umontreal.ca <archambv@iro.umontreal.ca> Ämne: Re: Christmas wish: Literate Elisp > My proposal is to slightly change Elisp parser to treat lines that start > with any other printable character but '(' as a start of comment and to > simply ignore the line, just as it treats ';' as a comment. The `sexpresso` Haskell package follows the same idea ;-) As for using it in Elisp: I don't think there's anything stopping anyone from making such a `literate-elisp-mode` and even arrange for `load` to handle such a file (just like there is already a package that lets `load` work directly on .org files). I'd welcome such a package in GNU ELPA. Stefan [-- Attachment #2: Type: text/html, Size: 2520 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Christmas wish: Literate Elisp 2019-12-14 4:40 ` Sv: " arthur miller @ 2019-12-14 14:08 ` Stefan Monnier 2019-12-15 8:37 ` arthur miller 2019-12-16 12:01 ` Sv: " arthur miller 0 siblings, 2 replies; 45+ messages in thread From: Stefan Monnier @ 2019-12-14 14:08 UTC (permalink / raw) To: arthur miller; +Cc: archambv@iro.umontreal.ca, emacs-devel arthur miller [2019-12-14 04:40:30] wrote: > To be honest my contact with Haskell broke once the university course, some > 20 yrs ago was over, so I am a little bit illiterate about Haskells sexy > packages. I just recalled that it was possible to invert text and code in > Haskell. But cool. The fact that it's written is Haskell is just incidental. > Didn't know there is a package to let load org files directly either. Hmm... The closest I can find is https://github.com/jingtaozf/literate-elisp/ but it doesn't quite match what I think I was referring to. Stefan > Thanks for the answers. > ________________________________ > Från: Stefan Monnier <monnier@iro.umontreal.ca> > Skickat: den 12 december 2019 18:29 > Till: arthur miller <arthur.miller@live.com> > Kopia: emacs-devel <emacs-devel@gnu.org>; archambv@iro.umontreal.ca <archambv@iro.umontreal.ca> > Ämne: Re: Christmas wish: Literate Elisp > >> My proposal is to slightly change Elisp parser to treat lines that start >> with any other printable character but '(' as a start of comment and to >> simply ignore the line, just as it treats ';' as a comment. > > The `sexpresso` Haskell package follows the same idea ;-) > > As for using it in Elisp: I don't think there's anything stopping anyone > from making such a `literate-elisp-mode` and even arrange for `load` to > handle such a file (just like there is already a package that lets > `load` work directly on .org files). > > I'd welcome such a package in GNU ELPA. > > > Stefan ^ permalink raw reply [flat|nested] 45+ messages in thread
* RE: Sv: Christmas wish: Literate Elisp 2019-12-14 14:08 ` Stefan Monnier @ 2019-12-15 8:37 ` arthur miller 2019-12-16 12:01 ` Sv: " arthur miller 1 sibling, 0 replies; 45+ messages in thread From: arthur miller @ 2019-12-15 8:37 UTC (permalink / raw) To: Stefan Monnier; +Cc: archambv@iro.umontreal.ca, emacs-devel [-- Attachment #1: Type: text/plain, Size: 2408 bytes --] Thanks, I have also found literste-li when I searched, but thought it didn't looked as suggested . I have played a bit yesterday, for about an hour and managed to find readevalloop in lread.c in sources. I managed to get a partial hack to work in some cases, but in other I get parse errors. I am not sure I understand exactly how the parser hangs together yet, if I can do everything in that function or I have to change some of other functions too. I will have more time tonight evening. Skickat från min Samsung Galaxy-smartphone. -------- Originalmeddelande -------- Från: Stefan Monnier <monnier@iro.umontreal.ca> Datum: 2019-12-14 15:08 (GMT+01:00) Till: arthur miller <arthur.miller@live.com> Kopia: emacs-devel <emacs-devel@gnu.org>, archambv@iro.umontreal.ca Ämne: Re: Sv: Christmas wish: Literate Elisp arthur miller [2019-12-14 04:40:30] wrote: > To be honest my contact with Haskell broke once the university course, some > 20 yrs ago was over, so I am a little bit illiterate about Haskells sexy > packages. I just recalled that it was possible to invert text and code in > Haskell. But cool. The fact that it's written is Haskell is just incidental. > Didn't know there is a package to let load org files directly either. Hmm... The closest I can find is https://github.com/jingtaozf/literate-elisp/ but it doesn't quite match what I think I was referring to. Stefan > Thanks for the answers. > ________________________________ > Från: Stefan Monnier <monnier@iro.umontreal.ca> > Skickat: den 12 december 2019 18:29 > Till: arthur miller <arthur.miller@live.com> > Kopia: emacs-devel <emacs-devel@gnu.org>; archambv@iro.umontreal.ca <archambv@iro.umontreal.ca> > Ämne: Re: Christmas wish: Literate Elisp > >> My proposal is to slightly change Elisp parser to treat lines that start >> with any other printable character but '(' as a start of comment and to >> simply ignore the line, just as it treats ';' as a comment. > > The `sexpresso` Haskell package follows the same idea ;-) > > As for using it in Elisp: I don't think there's anything stopping anyone > from making such a `literate-elisp-mode` and even arrange for `load` to > handle such a file (just like there is already a package that lets > `load` work directly on .org files). > > I'd welcome such a package in GNU ELPA. > > > Stefan [-- Attachment #2: Type: text/html, Size: 3734 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Sv: Christmas wish: Literate Elisp 2019-12-14 14:08 ` Stefan Monnier 2019-12-15 8:37 ` arthur miller @ 2019-12-16 12:01 ` arthur miller 2019-12-16 13:41 ` Stefan Monnier 1 sibling, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-16 12:01 UTC (permalink / raw) To: Stefan Monnier; +Cc: archambv@iro.umontreal.ca, emacs-devel [-- Attachment #1.1: Type: text/plain, Size: 2782 bytes --] Hello again, I was able to make readevalloop do what I want. It was rather trivial to implement this (once I realized how it works 🙂). Emacs built fine and I was able to test wtih eval-buffer and eval-regionwhich worked as intended. It was just 4 code lines, I just copied codeto parse comment and change the condition in if-statement: (message "Hello, World!") (message "Hello Again!") In code blocs the ';' is still a comment delimiter: (message ;; Here is a line comment "I am a bit chatty today!") That's it for today folks! (message "Bye bye cruel world!") This email was composed in scratch buffer and executed during writing with eval-buffer for testing. However, byte compiler is not happy about this. It emits warnings for every word out of code blocks as references to free variables. I am not sure where to look to patch it, maybe another day. ________________________________ Från: Stefan Monnier <monnier@iro.umontreal.ca> Skickat: den 14 december 2019 15:08 Till: arthur miller <arthur.miller@live.com> Kopia: emacs-devel <emacs-devel@gnu.org>; archambv@iro.umontreal.ca <archambv@iro.umontreal.ca> Ämne: Re: Sv: Christmas wish: Literate Elisp arthur miller [2019-12-14 04:40:30] wrote: > To be honest my contact with Haskell broke once the university course, some > 20 yrs ago was over, so I am a little bit illiterate about Haskells sexy > packages. I just recalled that it was possible to invert text and code in > Haskell. But cool. The fact that it's written is Haskell is just incidental. > Didn't know there is a package to let load org files directly either. Hmm... The closest I can find is https://github.com/jingtaozf/literate-elisp/ but it doesn't quite match what I think I was referring to. Stefan > Thanks for the answers. > ________________________________ > Från: Stefan Monnier <monnier@iro.umontreal.ca> > Skickat: den 12 december 2019 18:29 > Till: arthur miller <arthur.miller@live.com> > Kopia: emacs-devel <emacs-devel@gnu.org>; archambv@iro.umontreal.ca <archambv@iro.umontreal.ca> > Ämne: Re: Christmas wish: Literate Elisp > >> My proposal is to slightly change Elisp parser to treat lines that start >> with any other printable character but '(' as a start of comment and to >> simply ignore the line, just as it treats ';' as a comment. > > The `sexpresso` Haskell package follows the same idea ;-) > > As for using it in Elisp: I don't think there's anything stopping anyone > from making such a `literate-elisp-mode` and even arrange for `load` to > handle such a file (just like there is already a package that lets > `load` work directly on .org files). > > I'd welcome such a package in GNU ELPA. > > > Stefan [-- Attachment #1.2: Type: text/html, Size: 4373 bytes --] [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: lread.patch --] [-- Type: text/x-patch; name="lread.patch", Size: 389 bytes --] --- lread.c 2019-12-16 12:52:05.739490741 +0100 +++ mylread.c 2019-12-16 12:50:46.572077138 +0100 @@ -2053,6 +2053,12 @@ || c == NO_BREAK_SPACE) goto read_next; + if (c != '(' && c != '#') + { + while ((c = READCHAR) != '\n' && c != -1); + goto read_next; + } + if (! HASH_TABLE_P (read_objects_map) || XHASH_TABLE (read_objects_map)->count) read_objects_map ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Sv: Christmas wish: Literate Elisp 2019-12-16 12:01 ` Sv: " arthur miller @ 2019-12-16 13:41 ` Stefan Monnier 2019-12-16 14:02 ` Sv: " arthur miller 0 siblings, 1 reply; 45+ messages in thread From: Stefan Monnier @ 2019-12-16 13:41 UTC (permalink / raw) To: arthur miller; +Cc: archambv@iro.umontreal.ca, emacs-devel >> As for using it in Elisp: I don't think there's anything stopping anyone >> from making such a `literate-elisp-mode` and even arrange for `load` to >> handle such a file (just like there is already a package that lets >> `load` work directly on .org files). > I was able to make readevalloop do what I want. It was rather trivial to Note that in my comment above I meant it in existing Emacsen, i.e. without any modification to the C code. The idea is to make use of existing hooks such as `load-source-file-function` or `file-name-handler-alist`. I'm not sure what hook could be used to do the same with byte-compilation, but in the worst case, an advice should do the trick. Stefan ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-16 13:41 ` Stefan Monnier @ 2019-12-16 14:02 ` arthur miller 2019-12-16 16:07 ` Jonathan Leech-Pepin 0 siblings, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-16 14:02 UTC (permalink / raw) To: Stefan Monnier; +Cc: archambv@iro.umontreal.ca, emacs-devel [-- Attachment #1: Type: text/plain, Size: 1278 bytes --] Aha 😊 Sorry, I didn’t realized what you ment. I am not sure I know that much of elisp, but I may try to look at, would be lots of learning for me 😊. Skickades från E-post<https://go.microsoft.com/fwlink/?LinkId=550986> för Windows 10 Från: Stefan Monnier<mailto:monnier@iro.umontreal.ca> Skickat: den 16 december 2019 14:41 Till: arthur miller<mailto:arthur.miller@live.com> Kopia: emacs-devel<mailto:emacs-devel@gnu.org>; archambv@iro.umontreal.ca<mailto:archambv@iro.umontreal.ca> Ämne: Re: Sv: Sv: Christmas wish: Literate Elisp >> As for using it in Elisp: I don't think there's anything stopping anyone >> from making such a `literate-elisp-mode` and even arrange for `load` to >> handle such a file (just like there is already a package that lets >> `load` work directly on .org files). > I was able to make readevalloop do what I want. It was rather trivial to Note that in my comment above I meant it in existing Emacsen, i.e. without any modification to the C code. The idea is to make use of existing hooks such as `load-source-file-function` or `file-name-handler-alist`. I'm not sure what hook could be used to do the same with byte-compilation, but in the worst case, an advice should do the trick. Stefan [-- Attachment #2: Type: text/html, Size: 3263 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Sv: Christmas wish: Literate Elisp 2019-12-16 14:02 ` Sv: " arthur miller @ 2019-12-16 16:07 ` Jonathan Leech-Pepin 2019-12-17 2:09 ` arthur miller 0 siblings, 1 reply; 45+ messages in thread From: Jonathan Leech-Pepin @ 2019-12-16 16:07 UTC (permalink / raw) To: arthur miller; +Cc: archambv@iro.umontreal.ca, Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 1808 bytes --] Arthur, Have you happened to have looked at Outshine ( https://github.com/alphapapa/outshine)? It enhances outline-minor-mode and lets it work with standard org-syntax while in comment blocks (and defines hotkeys to swap into an edit buffer that makes it look like a normal Org-Mode buffer). By keeping the literate syntax in comments you don't break the existing parser. Regards, Jon On Mon, Dec 16, 2019 at 9:03 AM arthur miller <arthur.miller@live.com> wrote: > Aha 😊 > > Sorry, I didn’t realized what you ment. I am not sure I know that much of > elisp, > > but I may try to look at, would be lots of learning for me 😊. > > > > Skickades från E-post <https://go.microsoft.com/fwlink/?LinkId=550986> > för Windows 10 > > > > *Från: *Stefan Monnier <monnier@iro.umontreal.ca> > *Skickat: *den 16 december 2019 14:41 > *Till: *arthur miller <arthur.miller@live.com> > *Kopia: *emacs-devel <emacs-devel@gnu.org>; archambv@iro.umontreal.ca > *Ämne: *Re: Sv: Sv: Christmas wish: Literate Elisp > > > > >> As for using it in Elisp: I don't think there's anything stopping anyone > >> from making such a `literate-elisp-mode` and even arrange for `load` to > >> handle such a file (just like there is already a package that lets > >> `load` work directly on .org files). > > I was able to make readevalloop do what I want. It was rather trivial to > > Note that in my comment above I meant it in existing Emacsen, > i.e. without any modification to the C code. > The idea is to make use of existing hooks such as > `load-source-file-function` or `file-name-handler-alist`. > > I'm not sure what hook could be used to do the same with > byte-compilation, but in the worst case, an advice should do the trick. > > > Stefan > > > [-- Attachment #2: Type: text/html, Size: 3294 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* RE: Sv: Sv: Christmas wish: Literate Elisp 2019-12-16 16:07 ` Jonathan Leech-Pepin @ 2019-12-17 2:09 ` arthur miller 2019-12-17 11:06 ` Adam Porter 0 siblings, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-17 2:09 UTC (permalink / raw) To: Jonathan Leech-Pepin Cc: archambv@iro.umontreal.ca, Stefan Monnier, emacs-devel [-- Attachment #1: Type: text/plain, Size: 3097 bytes --] Of course, I am aware of outline modes, but my proposal is more about literate programming then outlining. Being able to use org outlining in elisp is just an extra icing on the cake that comes out implicitly as a bi product for free. Otherwise of course one can use outline code for folding. It is true, that keeping directives in comments does not break the existing parser, but then it is not so much of literate programming, is it? If we would just use directives in comments then we already have org + babel. But I think 4 extra lines of C code to enable this feature in eval-loop was a trivial price to pay :-). Now I just wonder how to change the bytecode compiler. Unfortunately it seems to be much more involved process. I don't know if I can do it, since I am not so acquainted with Emacs internals, so it would be cool if someone more knowledgeable can at least hint me if not help. Skickat från min Samsung Galaxy-smartphone. -------- Originalmeddelande -------- Från: Jonathan Leech-Pepin <jonathan.leechpepin@gmail.com> Datum: 2019-12-16 17:07 (GMT+01:00) Till: arthur miller <arthur.miller@live.com> Kopia: Stefan Monnier <monnier@iro.umontreal.ca>, archambv@iro.umontreal.ca, emacs-devel <emacs-devel@gnu.org> Ämne: Re: Sv: Sv: Christmas wish: Literate Elisp Arthur, Have you happened to have looked at Outshine (https://github.com/alphapapa/outshine)? It enhances outline-minor-mode and lets it work with standard org-syntax while in comment blocks (and defines hotkeys to swap into an edit buffer that makes it look like a normal Org-Mode buffer). By keeping the literate syntax in comments you don't break the existing parser. Regards, Jon On Mon, Dec 16, 2019 at 9:03 AM arthur miller <arthur.miller@live.com<mailto:arthur.miller@live.com>> wrote: Aha 😊 Sorry, I didn’t realized what you ment. I am not sure I know that much of elisp, but I may try to look at, would be lots of learning for me 😊. Skickades från E-post<https://go.microsoft.com/fwlink/?LinkId=550986> för Windows 10 Från: Stefan Monnier<mailto:monnier@iro.umontreal.ca> Skickat: den 16 december 2019 14:41 Till: arthur miller<mailto:arthur.miller@live.com> Kopia: emacs-devel<mailto:emacs-devel@gnu.org>; archambv@iro.umontreal.ca<mailto:archambv@iro.umontreal.ca> Ämne: Re: Sv: Sv: Christmas wish: Literate Elisp >> As for using it in Elisp: I don't think there's anything stopping anyone >> from making such a `literate-elisp-mode` and even arrange for `load` to >> handle such a file (just like there is already a package that lets >> `load` work directly on .org files). > I was able to make readevalloop do what I want. It was rather trivial to Note that in my comment above I meant it in existing Emacsen, i.e. without any modification to the C code. The idea is to make use of existing hooks such as `load-source-file-function` or `file-name-handler-alist`. I'm not sure what hook could be used to do the same with byte-compilation, but in the worst case, an advice should do the trick. Stefan [-- Attachment #2: Type: text/html, Size: 5392 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Sv: Christmas wish: Literate Elisp 2019-12-17 2:09 ` arthur miller @ 2019-12-17 11:06 ` Adam Porter 2019-12-18 16:29 ` Sv: " arthur miller 0 siblings, 1 reply; 45+ messages in thread From: Adam Porter @ 2019-12-17 11:06 UTC (permalink / raw) To: emacs-devel arthur miller <arthur.miller@live.com> writes: > It is true, that keeping directives in comments does not break the > existing parser, but then it is not so much of literate programming, > is it? Literate programming is not a matter of syntax. For example, this summary in the Wikipedia article seems to describe it well: Literate programming is a programming paradigm introduced by Donald Knuth in which a computer program is given an explanation of its logic in a natural language, such as English, interspersed with snippets of macros and traditional source code, from which compilable source code can be generated. The literate programming paradigm, as conceived by Knuth, represents a move away from writing computer programs in the manner and order imposed by the computer, and instead enables programmers to develop programs in the order demanded by the logic and flow of their thoughts. Literate programs are written as an uninterrupted exposition of logic in an ordinary human language, much like the text of an essay, in which macros are included to hide abstractions and traditional source code. Literate programming (LP) tools are used to obtain two representations from a literate source file: one suitable for further compilation or execution by a computer, the "tangled" code, and another for viewing as formatted documentation, which is said to be "woven" from the literate source. While the first generation of literate programming tools were computer language-specific, the later ones are language-agnostic and exist above the programming languages. None of that requires un-prefixed comment syntax. Consider examples of actual, full-scale literate programming projects, which are written in a variety of languages and source code formats. > If we would just use directives in comments then we already have org + > babel. But I think 4 extra lines of C code to enable this feature in > eval-loop was a trivial price to pay :-). Changing the canonical parser of a widely used language would have effects reaching far beyond the parser's native software. Consider all other software which parses Elisp, e.g. syntax highlighting tools outside of Emacs, which would not correctly highlight these un-prefixed comments you propose. As well, consider other implementations, like Guile's, which would also have to be adjusted. Then consider all the code linting tools which would likely need fixing. It's not merely a matter of 4 lines of code in an Emacs source file. As has been mentioned, benefits such as outlining are easily achieved with existing tools, some of which are even built-in to Emacs (e.g. outline-minor-mode for simple outlining in Elisp files, and org-mode for prose-first, noweb-style source files). Are you really so concerned about omitting a semicolon at the beginning of top-level comment lines that you want to change the Elisp parser? ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-17 11:06 ` Adam Porter @ 2019-12-18 16:29 ` arthur miller 2019-12-18 18:49 ` Adam Porter 0 siblings, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-18 16:29 UTC (permalink / raw) To: Adam Porter, emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 5997 bytes --] Hello, sorry for a bit late answer, but I was very busy Monday/Tuesday. To make this more readable I will try to summerize here as one-piece text for easier reading. As you mention yourself from,Wikipedia, literate programming is about moving away from programming for computers to programming for humans. Using comments to comment-away text ment for humans or to mark lines between comments and code is indeed writing for the computer, not the human. Humans tend to be distracted by unnecessary clutter, and managing stuff just for the sake of machine does take a little more effort then not doing it. Being programming-language agnostic though is probably not possible without having some kind of special tool, or special syntax due to some languages being probably very hard to distinguish from ordinary text. For example I believe that C/C++ or even Bash or Makefiles are very hard if not impossible to process that way without some very complicated parser. I can also imagine case where Elisp is impossible to distinguish from text, (for example this line is valid text but would fail in parser), or whatever we would put into a parenthesis on a separate line that does not belong to code. Anyway, due to elisp looks, we have those "natural markers", ( and ) which we can use as delimiters between code and text. For the question of being concerned about omitting ';' to change the parser. Well yes :-). Small syntactic sugar change but it reduces that visual clutter. It is one step in that direction of writing code for humans and not for the computer. See it as experiment. I thought it would be a cool thing to have. It is just an idea. The change is not in an intrusive way. All your elisp is still very same. It just adds an extra feature pretty much for free. If it would be an intrusive change that requires your old elisp to change, than I wouldn't suggest it. By the way, one could also add a variable to turn off that feature. As for the tools, since old elisp code does not change, all your tools would still continue to work on all your ordinary elisp, and you could still use ';' just as you do now. What would change is that you would be able to write some elisp as you can't now, and only on that code the tools would probably get confused. I have no idea how hard would it be to change font-locking and indentation checkers, maybe hard, maybe not at all. I can't answer that since I am not acquianted with how those tools are implemented (lots of regex as I have heard). But in worst case, you can always fall back on writing ordinary elisp. As a note, one will still have to use ';' in directives, like ;;;###autoload or ;;; -*- lexical-binding: t; -*- . Otherwise it would need lots more work to get it to work, which I am not sure is worth. Från: Adam Porter<mailto:adam@alphapapa.net> Skickat: den 17 december 2019 12:07 Till: emacs-devel@gnu.org<mailto:emacs-devel@gnu.org> Ämne: Re: Sv: Sv: Christmas wish: Literate Elisp arthur miller <arthur.miller@live.com> writes: > It is true, that keeping directives in comments does not break the > existing parser, but then it is not so much of literate programming, > is it? Literate programming is not a matter of syntax. For example, this summary in the Wikipedia article seems to describe it well: Literate programming is a programming paradigm introduced by Donald Knuth in which a computer program is given an explanation of its logic in a natural language, such as English, interspersed with snippets of macros and traditional source code, from which compilable source code can be generated. The literate programming paradigm, as conceived by Knuth, represents a move away from writing computer programs in the manner and order imposed by the computer, and instead enables programmers to develop programs in the order demanded by the logic and flow of their thoughts. Literate programs are written as an uninterrupted exposition of logic in an ordinary human language, much like the text of an essay, in which macros are included to hide abstractions and traditional source code. Literate programming (LP) tools are used to obtain two representations from a literate source file: one suitable for further compilation or execution by a computer, the "tangled" code, and another for viewing as formatted documentation, which is said to be "woven" from the literate source. While the first generation of literate programming tools were computer language-specific, the later ones are language-agnostic and exist above the programming languages. None of that requires un-prefixed comment syntax. Consider examples of actual, full-scale literate programming projects, which are written in a variety of languages and source code formats. > If we would just use directives in comments then we already have org + > babel. But I think 4 extra lines of C code to enable this feature in > eval-loop was a trivial price to pay :-). Changing the canonical parser of a widely used language would have effects reaching far beyond the parser's native software. Consider all other software which parses Elisp, e.g. syntax highlighting tools outside of Emacs, which would not correctly highlight these un-prefixed comments you propose. As well, consider other implementations, like Guile's, which would also have to be adjusted. Then consider all the code linting tools which would likely need fixing. It's not merely a matter of 4 lines of code in an Emacs source file. As has been mentioned, benefits such as outlining are easily achieved with existing tools, some of which are even built-in to Emacs (e.g. outline-minor-mode for simple outlining in Elisp files, and org-mode for prose-first, noweb-style source files). Are you really so concerned about omitting a semicolon at the beginning of top-level comment lines that you want to change the Elisp parser? [-- Attachment #2: Type: text/html, Size: 9182 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-18 16:29 ` Sv: " arthur miller @ 2019-12-18 18:49 ` Adam Porter 2019-12-18 20:04 ` Sv: " arthur miller 2019-12-18 21:18 ` Sv: Sv: Sv: " Stefan Monnier 0 siblings, 2 replies; 45+ messages in thread From: Adam Porter @ 2019-12-18 18:49 UTC (permalink / raw) To: emacs-devel arthur miller <arthur.miller@live.com> writes: > As you mention yourself from,Wikipedia, literate programming is about moving > away from programming for computers to programming for humans. Using comments > to comment-away text ment for humans or to mark lines between comments and > code is indeed writing for the computer, not the human. Humans tend to be > distracted by unnecessary clutter, and managing stuff just for the sake of > machine does take a little more effort then not doing it. ; I am not more distracted while reading this line of text than I am while reading this one. On the contrary, the semicolon prefix (and fontification according to my preferences in Elisp buffers) makes it easy for me to see what is code and what is prose. > I can also imagine case where Elisp is impossible to distinguish from text, > (for example this line is valid text but would fail in parser), or whatever > we would put into a parenthesis on a separate line that does not > belong to code. That line beginning with a paren parses as valid Elisp. Whether it evaluates depends on the context. > Anyway, due to elisp looks, we have those "natural markers", ( and ) which > we can use as delimiters between code and text. This is the problem: as you have shown, parentheses commonly appear in prose, even at the beginning of lines. Punctuation, such as semicolons, do not ; or, at least, should not. > For the question of being concerned about omitting ';' to change the parser. > Well yes :-). Small syntactic sugar change but it reduces that visual > clutter. You call it clutter; I call it clearly delineating code and prose. What would look cluttered to me would be prose (which may include commented-out code) interspersed with (insert "code, which may include or generate prose.") > It is one step in that direction of writing code for humans and not for the > computer. Until we can write programs in human language, we must write both. For humans' sake, the two need to be clearly separated. If you don't like comment prefix syntax, you can use Org files and their source blocks, so your prose and your code can both start at column 0. You can even choose a face for org-meta-line that makes #+BEGIN_SRC lines virtually (or literally!) disappear. > See it as experiment. I thought it would be a cool thing to have. It > is just an idea. The change is not in an intrusive way. All your elisp > is still very same. It just adds an extra feature pretty much for > free. If it would be an intrusive change that requires your old elisp > to change, than I wouldn't suggest it. By the way, one could also add > a variable to turn off that feature. No, in fact, some of my Elisp would have to change, because it would no longer be sufficient to look at comment prefixes to know whether a line is code or comment. Such a change would be very expensive in terms of the necessary human work that would ripple outward. And your proposed variable would not obviate the need to account for both states in my code. And since parens can appear at the start of lines in prose, how would anyone but a human know whether a line is code or prose? > As for the tools, since old elisp code does not change, all your tools > would still continue to work on all your ordinary elisp, and you could > still use ';' just as you do now. What would change is that you would > be able to write some elisp as you can't now, and only on that code > the tools would probably get confused. I have no idea how hard would > it be to change font-locking and indentation checkers, maybe hard, > maybe not at all. I can't answer that since I am not acquianted with > how those tools are implemented (lots of regex as I have heard). > But in worst case, you can always fall back on writing ordinary elisp. My tools which handle Elisp would have no such luxury, because they must handle all valid Elisp. > I have no idea how hard would it be to change font-locking and > indentation checkers, maybe hard, maybe not at all. Please, if you won't take my word for it, try it and see. ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-18 18:49 ` Adam Porter @ 2019-12-18 20:04 ` arthur miller 2019-12-18 23:18 ` Adam Porter 2019-12-18 21:18 ` Sv: Sv: Sv: " Stefan Monnier 1 sibling, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-18 20:04 UTC (permalink / raw) To: Adam Porter, emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 7893 bytes --] > On the contrary, the semicolon prefix (and fontification according to my > preferences in Elisp buffers) makes it easy for me to see what is code > and what is prose. Aren’t starting ’(’ and ’)’ + identation enough? > No, in fact, some of my Elisp would have to change, because it would no > onger be sufficient to look at comment prefixes to know whether a line > s code or comment. Such a change would be very expensive in terms of > the necessary human work that would ripple outward. And your proposed > variable would not obviate the need to account for both states in my > code. In which way? Can you alaborate more please? You would not need to write anything special. If you don’t wish to write literal code, then just don’t. Prefix your comment lines with ’;’ as currently and don’t care about it, Everything will work as it does now. I don’t see a problem there. If I am wrong please explain. > This is the problem: as you have shown, parentheses commonly appear in > prose, even at the beginning of lines. Punctuation, such as semicolons, > do not > ; or, at least, should not Yes, and it is always possible to construct some obscure case where things break. Look for example at C or C++ and all undefined behaviours in the standard. I mean, sure, there are always soem obscurities, but do they matter? If one writes an article or a book or some prosa and uses literal programming, and there is one explicit case not allowed to use, how important is than to use exactly that constrcut? I mean considering cons and pros, should one abandon the entire idea because of one minor obscurity? > Until we can write programs in human language, we must write both. For > humans' sake, the two need to be clearly separated. If you don't like > comment prefix syntax, you can use Org files and their source blocks, so > your prose and your code can both start at column 0. You can even > choose a face for org-meta-line that makes #+BEGIN_SRC lines virtually > (or literally!) disappear. Well as I see literal programming it is to make it easier for humans to mix code and prosa. What I proposedis just one small step further in that direction. I don’t see how org makes it any different? In org you still have to use both ’;’ and #+BEGIN_SRC - #+END_SRC markers. So it is even more clutter to eye. It is not about starting at column 0, It is about being able to simple write and mix code and text. If it is good or bad idea is up to individual preference. I personally find it a cool thing, you seem to think it violates old ways, so obviously we wont agree on that one. But thank you for the discussion, I surely appreciate the input, even if I don’t agree on the main conclusion. I gladly read more! As a small reflection about us humans being slentrians, I have an illustration. Caves are still as good for living as they were 20 000 years ago. We can for sure make many cases against living in houses such as not being natural, can crash on it’s inhabitants, cost resources to construct etc etc. But yet, pros of liiving in houses outweigh far the cons, and not many people today prefer to live in a cave. Sorry maybe ti is a too contrived illustration. Anyway, if you are good with ’;’ just continue to use it. But if a change like this does not seem to cost lots in development terms, then why opposing if somebody else find it cool. It is just that is more elegant and in a sense cool thing to be able to do it without special tools as some markers. Från: Adam Porter<mailto:adam@alphapapa.net> Skickat: den 18 december 2019 19:50 Till: emacs-devel@gnu.org<mailto:emacs-devel@gnu.org> Ämne: Re: Sv: Sv: Sv: Christmas wish: Literate Elisp arthur miller <arthur.miller@live.com> writes: > As you mention yourself from,Wikipedia, literate programming is about moving > away from programming for computers to programming for humans. Using comments > to comment-away text ment for humans or to mark lines between comments and > code is indeed writing for the computer, not the human. Humans tend to be > distracted by unnecessary clutter, and managing stuff just for the sake of > machine does take a little more effort then not doing it. ; I am not more distracted while reading this line of text than I am while reading this one. On the contrary, the semicolon prefix (and fontification according to my preferences in Elisp buffers) makes it easy for me to see what is code and what is prose. > I can also imagine case where Elisp is impossible to distinguish from text, > (for example this line is valid text but would fail in parser), or whatever > we would put into a parenthesis on a separate line that does not > belong to code. That line beginning with a paren parses as valid Elisp. Whether it evaluates depends on the context. > Anyway, due to elisp looks, we have those "natural markers", ( and ) which > we can use as delimiters between code and text. This is the problem: as you have shown, parentheses commonly appear in prose, even at the beginning of lines. Punctuation, such as semicolons, do not ; or, at least, should not. > For the question of being concerned about omitting ';' to change the parser. > Well yes :-). Small syntactic sugar change but it reduces that visual > clutter. You call it clutter; I call it clearly delineating code and prose. What would look cluttered to me would be prose (which may include commented-out code) interspersed with (insert "code, which may include or generate prose.") > It is one step in that direction of writing code for humans and not for the > computer. Until we can write programs in human language, we must write both. For humans' sake, the two need to be clearly separated. If you don't like comment prefix syntax, you can use Org files and their source blocks, so your prose and your code can both start at column 0. You can even choose a face for org-meta-line that makes #+BEGIN_SRC lines virtually (or literally!) disappear. > See it as experiment. I thought it would be a cool thing to have. It > is just an idea. The change is not in an intrusive way. All your elisp > is still very same. It just adds an extra feature pretty much for > free. If it would be an intrusive change that requires your old elisp > to change, than I wouldn't suggest it. By the way, one could also add > a variable to turn off that feature. No, in fact, some of my Elisp would have to change, because it would no longer be sufficient to look at comment prefixes to know whether a line is code or comment. Such a change would be very expensive in terms of the necessary human work that would ripple outward. And your proposed variable would not obviate the need to account for both states in my code. And since parens can appear at the start of lines in prose, how would anyone but a human know whether a line is code or prose? > As for the tools, since old elisp code does not change, all your tools > would still continue to work on all your ordinary elisp, and you could > still use ';' just as you do now. What would change is that you would > be able to write some elisp as you can't now, and only on that code > the tools would probably get confused. I have no idea how hard would > it be to change font-locking and indentation checkers, maybe hard, > maybe not at all. I can't answer that since I am not acquianted with > how those tools are implemented (lots of regex as I have heard). > But in worst case, you can always fall back on writing ordinary elisp. My tools which handle Elisp would have no such luxury, because they must handle all valid Elisp. > I have no idea how hard would it be to change font-locking and > indentation checkers, maybe hard, maybe not at all. Please, if you won't take my word for it, try it and see. [-- Attachment #2: Type: text/html, Size: 13297 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-18 20:04 ` Sv: " arthur miller @ 2019-12-18 23:18 ` Adam Porter 2019-12-18 23:53 ` Sv: " arthur miller 0 siblings, 1 reply; 45+ messages in thread From: Adam Porter @ 2019-12-18 23:18 UTC (permalink / raw) To: emacs-devel arthur miller <arthur.miller@live.com> writes: >> On the contrary, the semicolon prefix (and fontification according to >> my preferences in Elisp buffers) makes it easy for me to see what is >> code and what is prose. > > Aren’t starting ’(’ and ’)’ + identation enough? I explained in the message you quoted why they are not enough. Please read it carefully. >> No, in fact, some of my Elisp would have to change, because it would >> no onger be sufficient to look at comment prefixes to know whether a >> line s code or comment. Such a change would be very expensive in >> terms of the necessary human work that would ripple outward. And >> your proposed variable would not obviate the need to account for both >> states in my code. > > In which way? Can you alaborate more please? You would not need to > write anything special. If you don’t wish to write literal code, then > just don’t. Prefix your comment lines with ’;’ as currently and don’t > care about it, Everything will work as it does now. I don’t see a > problem there. If I am wrong please explain. You don't seem to understand. I am talking about existing code outside of emacs.git which parses Elisp, which would not be compatible with your proposed changes to Elisp syntax. >> This is the problem: as you have shown, parentheses commonly appear in >> prose, even at the beginning of lines. Punctuation, such as semicolons, >> do not >> ; or, at least, should not > > Yes, and it is always possible to construct some obscure case where > things break. Look for example at C or C++ and all undefined > behaviours in the standard. I mean, sure, there are always soem > obscurities, but do they matter? If one writes an article or a book or > some prosa and uses literal programming, and there is one explicit > case not allowed to use, how important is than to use exactly that > constrcut? I mean considering cons and pros, should one abandon the > entire idea because of one minor obscurity? Your own message showed how it happens in prose. In fact, it's common enough and ambiguous enough that Elisp already forbids open-parens at column 0 in strings and requires them to be escaped. How is this a minor obscurity? Don't you realize how important it is that syntax in a file format be unambiguous? > Well as I see literal programming it is to make it easier for humans > to mix code and prosa. What I proposedis just one small step further > in that direction. It is also a step toward ambiguity, churn, and bugs in other people's code, which you would not have to fix. > I don’t see how org makes it any different? In org you still have to > use both ’;’ and #+BEGIN_SRC - #+END_SRC markers. Have you used Org mode? Have you looked at a literate program written in an Org file? The point is that top-level comments are written between code blocks, without comment prefixes. > So it is even more clutter to eye. As I said in the message you're replying to: You can even choose a face for org-meta-line that makes #+BEGIN_SRC lines virtually (or literally!) disappear. > It is about being able to simple write and mix code and text. If it is > good or bad idea is up to individual preference. I personally find it > a cool thing, you seem to think it violates old ways, I have said nothing about old ways. I explained exactly what the problems with the proposal are. Please read my message carefully. > As a small reflection about us humans being slentrians, I have an > illustration. Caves are still as good for living as they were 20 000 > years ago. We can for sure make many cases against living in houses > such as not being natural, can crash on it’s inhabitants, cost > resources to construct etc etc. But yet, pros of liiving in houses > outweigh far the cons, and not many people today prefer to live in a > cave. Sorry maybe ti is a too contrived illustration. Anyway, if you > are good with ’;’ just continue to use it. But if a change like this > does not seem to cost lots in development terms, then why opposing if > somebody else find it cool. It is just that is more elegant and in a > sense cool thing to be able to do it without special tools as some > markers. It's not cool to imply that citing technical problems with your proposal is like being a cave-dweller. ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-18 23:18 ` Adam Porter @ 2019-12-18 23:53 ` arthur miller 2019-12-20 15:58 ` Unknown 0 siblings, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-18 23:53 UTC (permalink / raw) To: Adam Porter, emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 6392 bytes --] I didn’t say you are a cave dweller. I am sorry if you perceive my illustration that way. That was just a very first image that came into my mind. Sorry if you find it somehow offending. I was just trying to say that a case can be made against literally anything. One has to compare cons and pros, and see if pros outweigh the cons. I don’t want to repeat myself, but I am sure that as long as one don’t use the new feature all your external tools will continue to work as they do now. If you don’t write literal code then your code would look like just as it does now, so no confusion there. If it is disabled by default then I see no way it could confuse any existing tool. I might be wrong of course, but please give me technical reasons. Tools need to be updated just if they will be used with new syntax. So in general, if you have a tool that can’t deal with ”literal syntax”, than don’t use the literal syntax or the tool. Is that a problem? About literal programs without special markers being confusing: honestly I believe that most humans find it quite easy to understand the difference between text (prose for humans) and code (prose for computers). I don't think humans need explicit markers as comments or similar. Comments are written for computers to distinguish between code and things they should ignore so that we humans can communicate with each other in our code. I don’t know, something like that. I can totally understand if this proposal is not implementable due to technical reasons, or that this really does not give that much of a value to be worth enabling. But I don’t buy the argument that humans need some special markers to understand the difference between code and text. The whole Idea with literal programming is to minimize that difference. Från: Adam Porter<mailto:adam@alphapapa.net> Skickat: den 19 december 2019 00:18 Till: emacs-devel@gnu.org<mailto:emacs-devel@gnu.org> Ämne: Re: Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp arthur miller <arthur.miller@live.com> writes: >> On the contrary, the semicolon prefix (and fontification according to >> my preferences in Elisp buffers) makes it easy for me to see what is >> code and what is prose. > > Aren’t starting ’(’ and ’)’ + identation enough? I explained in the message you quoted why they are not enough. Please read it carefully. >> No, in fact, some of my Elisp would have to change, because it would >> no onger be sufficient to look at comment prefixes to know whether a >> line s code or comment. Such a change would be very expensive in >> terms of the necessary human work that would ripple outward. And >> your proposed variable would not obviate the need to account for both >> states in my code. > > In which way? Can you alaborate more please? You would not need to > write anything special. If you don’t wish to write literal code, then > just don’t. Prefix your comment lines with ’;’ as currently and don’t > care about it, Everything will work as it does now. I don’t see a > problem there. If I am wrong please explain. You don't seem to understand. I am talking about existing code outside of emacs.git which parses Elisp, which would not be compatible with your proposed changes to Elisp syntax. >> This is the problem: as you have shown, parentheses commonly appear in >> prose, even at the beginning of lines. Punctuation, such as semicolons, >> do not >> ; or, at least, should not > > Yes, and it is always possible to construct some obscure case where > things break. Look for example at C or C++ and all undefined > behaviours in the standard. I mean, sure, there are always soem > obscurities, but do they matter? If one writes an article or a book or > some prosa and uses literal programming, and there is one explicit > case not allowed to use, how important is than to use exactly that > constrcut? I mean considering cons and pros, should one abandon the > entire idea because of one minor obscurity? Your own message showed how it happens in prose. In fact, it's common enough and ambiguous enough that Elisp already forbids open-parens at column 0 in strings and requires them to be escaped. How is this a minor obscurity? Don't you realize how important it is that syntax in a file format be unambiguous? > Well as I see literal programming it is to make it easier for humans > to mix code and prosa. What I proposedis just one small step further > in that direction. It is also a step toward ambiguity, churn, and bugs in other people's code, which you would not have to fix. > I don’t see how org makes it any different? In org you still have to > use both ’;’ and #+BEGIN_SRC - #+END_SRC markers. Have you used Org mode? Have you looked at a literate program written in an Org file? The point is that top-level comments are written between code blocks, without comment prefixes. > So it is even more clutter to eye. As I said in the message you're replying to: You can even choose a face for org-meta-line that makes #+BEGIN_SRC lines virtually (or literally!) disappear. > It is about being able to simple write and mix code and text. If it is > good or bad idea is up to individual preference. I personally find it > a cool thing, you seem to think it violates old ways, I have said nothing about old ways. I explained exactly what the problems with the proposal are. Please read my message carefully. > As a small reflection about us humans being slentrians, I have an > illustration. Caves are still as good for living as they were 20 000 > years ago. We can for sure make many cases against living in houses > such as not being natural, can crash on it’s inhabitants, cost > resources to construct etc etc. But yet, pros of liiving in houses > outweigh far the cons, and not many people today prefer to live in a > cave. Sorry maybe ti is a too contrived illustration. Anyway, if you > are good with ’;’ just continue to use it. But if a change like this > does not seem to cost lots in development terms, then why opposing if > somebody else find it cool. It is just that is more elegant and in a > sense cool thing to be able to do it without special tools as some > markers. It's not cool to imply that citing technical problems with your proposal is like being a cave-dweller. [-- Attachment #2: Type: text/html, Size: 9395 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Christmas wish: Literate Elisp 2019-12-18 23:53 ` Sv: " arthur miller @ 2019-12-20 15:58 ` Unknown 0 siblings, 0 replies; 45+ messages in thread From: Unknown @ 2019-12-20 15:58 UTC (permalink / raw) To: arthur miller; +Cc: Adam Porter, emacs-devel@gnu.org arthur miller <arthur.miller@live.com> 작성: > I don’t want to repeat myself, but I am sure that as long as one don’t > use the new feature all your external tools will continue to work as > they do now. If you don’t write literal code then your code would look > like just as it does now, so no confusion there. If it is disabled by > default then I see no way it could confuse any existing tool. I might > be wrong of course, but please give me technical reasons. > Tools need to be updated just if they will be used with new syntax. So > in general, if you have a tool that can’t deal with ”literal syntax”, > than don’t use the literal syntax or the tool. Is that a problem? Yeah, it is, mostly because code written be people who believes that writing prose interleaved with Elisp without any explicit markers (like you) will break the existing tools. If one decided to push their prose-with-elisp code to GitHub, GitHub’s Elisp highlighter would be confused. That’s just one example with the problem. You might totally be fine with that: you know that it’s not the usual syntax… but other people would find out & be upset about that. I bet there will be elisp-mundging code in Emacs that aren’t hooked onto the reader… which means that those code will be also broken. > About literal programs without special markers being confusing: > honestly I believe that most humans find it quite easy to understand > the difference between text (prose for humans) and code (prose for > computers). I don't think humans need explicit markers as comments > or similar. Comments are written for computers to distinguish between > code and things they should ignore so that we humans can communicate > with each other in our code. I don’t know, something like that. I can > totally understand if this proposal is not implementable due to > technical reasons, or that this really does not give that much of a > value to be worth enabling. But I don’t buy the argument that humans > need some special markers to understand the difference between code > and text. The whole Idea with literal programming is to minimize that > difference. Well, maybe the whole idea of literal programming is to minimize the difference, but elisp isn’t for literal programming right? If you really want this, I would nudge you to make a Elisp dialect optimized for literal programming implemented by a preprocessor in the front of the Elisp reader. I really can’t see why this is beneficial to anyone (except maybe for you). > Från: Adam Porter > Skickat: den 19 december 2019 00:18 > Till: emacs-devel@gnu.org > Ämne: Re: Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp > > arthur miller <arthur.miller@live.com> writes: > > >> On the contrary, the semicolon prefix (and fontification according to > >> my preferences in Elisp buffers) makes it easy for me to see what is > >> code and what is prose. > > > > Aren’t starting ’(’ and ’)’ + identation enough? > > I explained in the message you quoted why they are not enough. Please > read it carefully. > > >> No, in fact, some of my Elisp would have to change, because it would > >> no onger be sufficient to look at comment prefixes to know whether a > >> line s code or comment. Such a change would be very expensive in > >> terms of the necessary human work that would ripple outward. And > >> your proposed variable would not obviate the need to account for both > >> states in my code. > > > > In which way? Can you alaborate more please? You would not need to > > write anything special. If you don’t wish to write literal code, then > > just don’t. Prefix your comment lines with ’;’ as currently and don’t > > care about it, Everything will work as it does now. I don’t see a > > problem there. If I am wrong please explain. > > You don't seem to understand. I am talking about existing code outside > of emacs.git which parses Elisp, which would not be compatible with your > proposed changes to Elisp syntax. > > >> This is the problem: as you have shown, parentheses commonly appear in > >> prose, even at the beginning of lines. Punctuation, such as semicolons, > >> do not > >> ; or, at least, should not > > > > Yes, and it is always possible to construct some obscure case where > > things break. Look for example at C or C++ and all undefined > > behaviours in the standard. I mean, sure, there are always soem > > obscurities, but do they matter? If one writes an article or a book or > > some prosa and uses literal programming, and there is one explicit > > case not allowed to use, how important is than to use exactly that > > constrcut? I mean considering cons and pros, should one abandon the > > entire idea because of one minor obscurity? > > Your own message showed how it happens in prose. In fact, it's common > enough and ambiguous enough that Elisp already forbids open-parens at > column 0 in strings and requires them to be escaped. How is this a > minor obscurity? > > Don't you realize how important it is that syntax in a file format be > unambiguous? > > > Well as I see literal programming it is to make it easier for humans > > to mix code and prosa. What I proposedis just one small step further > > in that direction. > > It is also a step toward ambiguity, churn, and bugs in other people's > code, which you would not have to fix. > > > I don’t see how org makes it any different? In org you still have to > > use both ’;’ and #+BEGIN_SRC - #+END_SRC markers. > > Have you used Org mode? Have you looked at a literate program written > in an Org file? The point is that top-level comments are written > between code blocks, without comment prefixes. > > > So it is even more clutter to eye. > > As I said in the message you're replying to: > > You can even choose a face for org-meta-line that makes #+BEGIN_SRC > lines virtually (or literally!) disappear. > > > It is about being able to simple write and mix code and text. If it is > > good or bad idea is up to individual preference. I personally find it > > a cool thing, you seem to think it violates old ways, > > I have said nothing about old ways. I explained exactly what the > problems with the proposal are. Please read my message carefully. > > > As a small reflection about us humans being slentrians, I have an > > illustration. Caves are still as good for living as they were 20 000 > > years ago. We can for sure make many cases against living in houses > > such as not being natural, can crash on it’s inhabitants, cost > > resources to construct etc etc. But yet, pros of liiving in houses > > outweigh far the cons, and not many people today prefer to live in a > > cave. Sorry maybe ti is a too contrived illustration. Anyway, if you > > are good with ’;’ just continue to use it. But if a change like this > > does not seem to cost lots in development terms, then why opposing if > > somebody else find it cool. It is just that is more elegant and in a > > sense cool thing to be able to do it without special tools as some > > markers. > > It's not cool to imply that citing technical problems with your proposal > is like being a cave-dweller. ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-18 18:49 ` Adam Porter 2019-12-18 20:04 ` Sv: " arthur miller @ 2019-12-18 21:18 ` Stefan Monnier 2019-12-18 22:43 ` Christmas wish: Literate Elisp (Intro) VanL 2019-12-18 22:59 ` Sv: Sv: Sv: Christmas wish: Literate Elisp Adam Porter 1 sibling, 2 replies; 45+ messages in thread From: Stefan Monnier @ 2019-12-18 21:18 UTC (permalink / raw) To: Adam Porter; +Cc: emacs-devel > ; I am not more distracted while reading this line of text > than I am while reading this one. Thre is no discussion of changing the existing syntax/semantic of Elisp here. Arthur is proposing a new file format/syntax as an alternative to the use of weave/tangle or Org-mode. You don't have to agree with each other. Stefan ^ permalink raw reply [flat|nested] 45+ messages in thread
* Christmas wish: Literate Elisp (Intro) 2019-12-18 21:18 ` Sv: Sv: Sv: " Stefan Monnier @ 2019-12-18 22:43 ` VanL 2019-12-19 0:05 ` Sv: " arthur miller 2019-12-18 22:59 ` Sv: Sv: Sv: Christmas wish: Literate Elisp Adam Porter 1 sibling, 1 reply; 45+ messages in thread From: VanL @ 2019-12-18 22:43 UTC (permalink / raw) To: emacs-devel >> ; I am not more distracted while reading this line of text >> than I am while reading this one. > > Thre is no discussion of changing the existing syntax/semantic of > Elisp here. Arthur is proposing a new file format/syntax as an > alternative to the use of weave/tangle or Org-mode. > > You don't have to agree with each other. Arthur's vision is a beautiful thing to my eyes. Lawyers and programmers can read and write, thoughtfully and clearly, together collaboratively, at the Creation before the two crashs. (message "Before you go, have you heard the comedian tell the joke about the lawyer, the scientist, and the engineer going to Mars?") -- VanL., 🐞 əə0@ 一 二 三 言 語 𝔖 元 示 証 明 海 自 己 漢 本 人 Gnus/Emacs (berkeley-unix) ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Christmas wish: Literate Elisp (Intro) 2019-12-18 22:43 ` Christmas wish: Literate Elisp (Intro) VanL @ 2019-12-19 0:05 ` arthur miller 0 siblings, 0 replies; 45+ messages in thread From: arthur miller @ 2019-12-19 0:05 UTC (permalink / raw) To: VanL, emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 1199 bytes --] 😊 Skickades från E-post<https://go.microsoft.com/fwlink/?LinkId=550986> för Windows 10 ________________________________ Från: Emacs-devel <emacs-devel-bounces+arthur.miller=live.com@gnu.org> för VanL <van@scratch.space> Skickat: Wednesday, December 18, 2019 11:43:39 PM Till: emacs-devel@gnu.org <emacs-devel@gnu.org> Ämne: Christmas wish: Literate Elisp (Intro) >> ; I am not more distracted while reading this line of text >> than I am while reading this one. > > Thre is no discussion of changing the existing syntax/semantic of > Elisp here. Arthur is proposing a new file format/syntax as an > alternative to the use of weave/tangle or Org-mode. > > You don't have to agree with each other. Arthur's vision is a beautiful thing to my eyes. Lawyers and programmers can read and write, thoughtfully and clearly, together collaboratively, at the Creation before the two crashs. (message "Before you go, have you heard the comedian tell the joke about the lawyer, the scientist, and the engineer going to Mars?") -- VanL., 🐞 əə0@ 一 二 三 言 語 𝔖 元 示 証 明 海 自 己 漢 本 人 Gnus/Emacs (berkeley-unix) [-- Attachment #2: Type: text/html, Size: 3189 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-18 21:18 ` Sv: Sv: Sv: " Stefan Monnier 2019-12-18 22:43 ` Christmas wish: Literate Elisp (Intro) VanL @ 2019-12-18 22:59 ` Adam Porter 2019-12-18 23:18 ` Sv: " arthur miller 1 sibling, 1 reply; 45+ messages in thread From: Adam Porter @ 2019-12-18 22:59 UTC (permalink / raw) To: emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: > Thre is no discussion of changing the existing syntax/semantic of > Elisp here. Arthur is proposing a new file format/syntax as an > alternative to the use of weave/tangle or Org-mode. That's not my understanding of what Arthur is proposing. You did propose an alternative file format in earlier messages when you wrote: > As for using it in Elisp: I don't think there's anything stopping > anyone from making such a `literate-elisp-mode` and even arrange for > `load` to handle such a file (just like there is already a package > that lets `load` work directly on .org files). I'd welcome such a > package in GNU ELPA. And: > Note that in my comment above I meant it in existing Emacsen, > i.e. without any modification to the C code. The idea is to make use > of existing hooks such as `load-source-file-function` or > `file-name-handler-alist`. I'm not sure what hook could be used to do > the same with byte-compilation, but in the worst case, an advice > should do the trick. But Arthur has been proposing to alter the Emacs Elisp parser itself, e.g. when he wrote: > My proposal is to slightly change Elisp parser to treat lines that > start with any other printable character but '(' as a start of comment > and to simply ignore the line, just as it treats ';' as a comment And: > I was able to make readevalloop do what I want. It was rather trivial > to implement this (once I realized how it works 🙂). Emacs built fine > and I was able to test wtih eval-buffer and eval-regionwhich worked as > intended. > It was just 4 code lines, I just copied codeto parse comment and > change the condition in if-statement: > However, byte compiler is not happy about this. It emits warnings for > every word out of code blocks as references to free variables. I am > not sure where to look to patch it, maybe another day. And: > If we would just use directives in comments then we already have org + > babel. But I think 4 extra lines of C code to enable this feature in > eval-loop was a trivial price to pay :-). > Now I just wonder how to change the bytecode compiler. Unfortunately > it seems to be much more involved process. I don't know if I can do > it, since I am not so acquainted with Emacs internals, so it would be > cool if someone more knowledgeable can at least hint me if not help. I've looked again at all messages in the thread. Am I missing something? ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-18 22:59 ` Sv: Sv: Sv: Christmas wish: Literate Elisp Adam Porter @ 2019-12-18 23:18 ` arthur miller 2019-12-18 23:52 ` Adam Porter 0 siblings, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-18 23:18 UTC (permalink / raw) To: Adam Porter, emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 3216 bytes --] Yes Adam you are correct, but altering parser does not necessary mean that elisp will change in a way that will force you to change your existing code or coding practice. I proposed it in a way that will simply add an extra feature, which you don’t need to use if you don’t like it. It is trivial to make it by default ”off” by introducing new variable one can set in init file to enable it (or disable it, whichever is better for default). Hope it makes it a bit more clear what I suggested. Från: Adam Porter<mailto:adam@alphapapa.net> Skickat: den 19 december 2019 00:00 Till: emacs-devel@gnu.org<mailto:emacs-devel@gnu.org> Ämne: Re: Sv: Sv: Sv: Christmas wish: Literate Elisp Stefan Monnier <monnier@iro.umontreal.ca> writes: > Thre is no discussion of changing the existing syntax/semantic of > Elisp here. Arthur is proposing a new file format/syntax as an > alternative to the use of weave/tangle or Org-mode. That's not my understanding of what Arthur is proposing. You did propose an alternative file format in earlier messages when you wrote: > As for using it in Elisp: I don't think there's anything stopping > anyone from making such a `literate-elisp-mode` and even arrange for > `load` to handle such a file (just like there is already a package > that lets `load` work directly on .org files). I'd welcome such a > package in GNU ELPA. And: > Note that in my comment above I meant it in existing Emacsen, > i.e. without any modification to the C code. The idea is to make use > of existing hooks such as `load-source-file-function` or > `file-name-handler-alist`. I'm not sure what hook could be used to do > the same with byte-compilation, but in the worst case, an advice > should do the trick. But Arthur has been proposing to alter the Emacs Elisp parser itself, e.g. when he wrote: > My proposal is to slightly change Elisp parser to treat lines that > start with any other printable character but '(' as a start of comment > and to simply ignore the line, just as it treats ';' as a comment And: > I was able to make readevalloop do what I want. It was rather trivial > to implement this (once I realized how it works 🙂). Emacs built fine > and I was able to test wtih eval-buffer and eval-regionwhich worked as > intended. > It was just 4 code lines, I just copied codeto parse comment and > change the condition in if-statement: > However, byte compiler is not happy about this. It emits warnings for > every word out of code blocks as references to free variables. I am > not sure where to look to patch it, maybe another day. And: > If we would just use directives in comments then we already have org + > babel. But I think 4 extra lines of C code to enable this feature in > eval-loop was a trivial price to pay :-). > Now I just wonder how to change the bytecode compiler. Unfortunately > it seems to be much more involved process. I don't know if I can do > it, since I am not so acquainted with Emacs internals, so it would be > cool if someone more knowledgeable can at least hint me if not help. I've looked again at all messages in the thread. Am I missing something? [-- Attachment #2: Type: text/html, Size: 5443 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-18 23:18 ` Sv: " arthur miller @ 2019-12-18 23:52 ` Adam Porter 2019-12-19 0:02 ` Sv: " arthur miller 0 siblings, 1 reply; 45+ messages in thread From: Adam Porter @ 2019-12-18 23:52 UTC (permalink / raw) To: emacs-devel arthur miller <arthur.miller@live.com> writes: > Yes Adam you are correct, but altering parser does not necessary mean > > that elisp will change in a way that will force you to change your > > existing code or coding practice. I proposed it in a way that will simply > > add an extra feature, which you don’t need to use if you don’t like it. It > > is trivial to make it by default ”off” by introducing new variable one can > > set in init file to enable it (or disable it, whichever is better for default). > > Hope it makes it a bit more clear what I suggested. (Please do not double-space your messages.) I have tried to explain this issue as clearly as I can. I will ask once more: Do you understand that Elisp code written in the way you propose would not be compatible with existing tools which parse Elisp? And that such tools would require modification to parse such code correctly? Stefan suggested ways to implement your idea as an alternative, literate syntax, in a separate file format, by writing it in Elisp, using advice and/or configuration variables, so that modification of the parser in C would not be required, and the existing Elisp syntax and parser would remain unchanged. That is a great idea. Why don't you want to do that? ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-18 23:52 ` Adam Porter @ 2019-12-19 0:02 ` arthur miller 2019-12-19 0:42 ` chad 0 siblings, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-19 0:02 UTC (permalink / raw) To: Adam Porter, emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 2243 bytes --] I actually answered in my previous mail. You are wrong about that this proposal would broke your tools. Those 4 lines of C, would cost me many more lines of elisp, as least as much as I can elisp (rather as little). I am currently fighting with byte compiler which is mostly elisp and it does not go so well 😊. By the way those 4 lines will be literally invisible (not entered) if one puts a variable around them as I suggested. For the record, even if I wrote an elisp package that implements this in pure elisp, and somebody decides to write ”literal code” your existings tools would still be broken. I don’t see how the implementation choice would change that matter nor do I see why is it so big matter for you? Från: Adam Porter<mailto:adam@alphapapa.net> Skickat: den 19 december 2019 00:53 Till: emacs-devel@gnu.org<mailto:emacs-devel@gnu.org> Ämne: Re: Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp arthur miller <arthur.miller@live.com> writes: > Yes Adam you are correct, but altering parser does not necessary mean > > that elisp will change in a way that will force you to change your > > existing code or coding practice. I proposed it in a way that will simply > > add an extra feature, which you don’t need to use if you don’t like it. It > > is trivial to make it by default ”off” by introducing new variable one can > > set in init file to enable it (or disable it, whichever is better for default). > > Hope it makes it a bit more clear what I suggested. (Please do not double-space your messages.) I have tried to explain this issue as clearly as I can. I will ask once more: Do you understand that Elisp code written in the way you propose would not be compatible with existing tools which parse Elisp? And that such tools would require modification to parse such code correctly? Stefan suggested ways to implement your idea as an alternative, literate syntax, in a separate file format, by writing it in Elisp, using advice and/or configuration variables, so that modification of the parser in C would not be required, and the existing Elisp syntax and parser would remain unchanged. That is a great idea. Why don't you want to do that? [-- Attachment #2: Type: text/html, Size: 4347 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-19 0:02 ` Sv: " arthur miller @ 2019-12-19 0:42 ` chad 2019-12-19 1:50 ` Jean-Christophe Helary 0 siblings, 1 reply; 45+ messages in thread From: chad @ 2019-12-19 0:42 UTC (permalink / raw) To: arthur miller; +Cc: Adam Porter, emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 3505 bytes --] It seems that there is a communications breakdown here. At the risk of poking the bear, I'm going to try to see if I can help resolve it. The place where you are adding 4 lines of C code does not change the syntax of elisp as a whole; it merely changes the way that particular version of emacs parses the new format. There is a large body of existing software which will be totally unaware of your changes. That body is large enough that it is doubtful that it can, as a practical matter, be reasonably changed to not break on the syntax changes that you are proposing. On the other hand, there are ways to accomplish what seems (at least to some of us) to be your stated goals without requiring a change to the syntax of elisp. Using that approach instead, that large body of existing software would continue to work, and, over time, might eventually be expanded to add extra value to the additions. (This principle is often described as "be conservative in what you send, and liberal in what you accept".) I hope that helps. ~Chad On Wed, Dec 18, 2019 at 4:03 PM arthur miller <arthur.miller@live.com> wrote: > I actually answered in my previous mail. You are wrong about > > that this proposal would broke your tools. > > Those 4 lines of C, would cost me many more lines of elisp, as least > > as much as I can elisp (rather as little). I am currently fighting with > > byte compiler which is mostly elisp and it does not go so well 😊. By > > the way those 4 lines will be literally invisible (not entered) if one puts > > a variable around them as I suggested. > > > > For the record, even if I wrote an elisp package that implements this in > > pure elisp, and somebody decides to write ”literal code” your existings > > tools would still be broken. I don’t see how the implementation choice > > would change that matter nor do I see why is it so big matter for you? > > > > *Från: *Adam Porter <adam@alphapapa.net> > *Skickat: *den 19 december 2019 00:53 > *Till: *emacs-devel@gnu.org > *Ämne: *Re: Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp > > > > arthur miller <arthur.miller@live.com> writes: > > > Yes Adam you are correct, but altering parser does not necessary mean > > > > that elisp will change in a way that will force you to change your > > > > existing code or coding practice. I proposed it in a way that will > simply > > > > add an extra feature, which you don’t need to use if you don’t like it. > It > > > > is trivial to make it by default ”off” by introducing new variable one > can > > > > set in init file to enable it (or disable it, whichever is better for > default). > > > > Hope it makes it a bit more clear what I suggested. > > (Please do not double-space your messages.) > > I have tried to explain this issue as clearly as I can. I will ask once > more: Do you understand that Elisp code written in the way you propose > would not be compatible with existing tools which parse Elisp? And that > such tools would require modification to parse such code correctly? > > Stefan suggested ways to implement your idea as an alternative, literate > syntax, in a separate file format, by writing it in Elisp, using advice > and/or configuration variables, so that modification of the parser in C > would not be required, and the existing Elisp syntax and parser would > remain unchanged. That is a great idea. Why don't you want to do that? > > > > [-- Attachment #2: Type: text/html, Size: 4960 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Christmas wish: Literate Elisp 2019-12-19 0:42 ` chad @ 2019-12-19 1:50 ` Jean-Christophe Helary 2019-12-20 0:55 ` Sv: " arthur miller 0 siblings, 1 reply; 45+ messages in thread From: Jean-Christophe Helary @ 2019-12-19 1:50 UTC (permalink / raw) To: emacs-devel@gnu.org > On Dec 19, 2019, at 9:42, chad <yandros@gmail.com> wrote: > > There is a large body of existing software which will be totally unaware of your changes. Although I think the premise of your comment is absolutely valid, I'm not so sure about the "*large* body of existing software". Jean-Christophe Helary ----------------------------------------------- http://mac4translators.blogspot.com @brandelune ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Christmas wish: Literate Elisp 2019-12-19 1:50 ` Jean-Christophe Helary @ 2019-12-20 0:55 ` arthur miller 2019-12-20 15:00 ` Stefan Monnier 0 siblings, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-20 0:55 UTC (permalink / raw) To: emacs-devel@gnu.org [-- Attachment #1.1: Type: text/plain, Size: 2538 bytes --] Here is a little prototype to test my idea with literal Elisp. I have patched read-eval loop as stated in previous mail, in lread.c. It is probably possible to implement that in Elisp, but I don't have enough knowledge of either Emacs internals nor Elisp to do this in some short time. It would took me a lot of time to look up all the things I would need. Anyway, C code turned to be rather trivial, and also completely by-passable if so desired, so I have introduced a user-customizable variable 'emacs-lisp-allow-literal-comments', which is by default nil. I wasn't sure in which elisp file to introduce this variable, so I have used 'simple.el' found in lisp directory of Emacs source distribution. That file seems to have some other user customizable variables that affect elisp so I thought it might be appropriate place. For the byte compiler I have patched bytecomp.el, in rather brutish way, but it seems to work. It wasn't very difficult either, but I think I have done it rather ugly. Someone might wish to refactor that code. Anyway, it is less then twenty lines of code, and it is by default bypassed as well. The variable that controls it is also user customizable and found in same file, named 'byte-comp-allow-literal-comments'. I have attached also a small trivial elisp file for illustration purpose. It is just a test of an idea, and small prototype to show that it might work. It needs more thorough testing and can probably be implemented in some better way. I have tested on GNU/Linux and Windows. Emacs was able to compile it's own elisp as well as external packages I use. As a note, the change in C is completely backwards compatible. No logical change to elisp parser happens when 'emacs-lisp-allow-literal-comments' variable is nil. ________________________________ Från: Emacs-devel <emacs-devel-bounces+arthur.miller=live.com@gnu.org> för Jean-Christophe Helary <jean.christophe.helary@traduction-libre.org> Skickat: den 19 december 2019 02:50 Till: emacs-devel@gnu.org <emacs-devel@gnu.org> Ämne: Re: Christmas wish: Literate Elisp > On Dec 19, 2019, at 9:42, chad <yandros@gmail.com> wrote: > > There is a large body of existing software which will be totally unaware of your changes. Although I think the premise of your comment is absolutely valid, I'm not so sure about the "*large* body of existing software". Jean-Christophe Helary ----------------------------------------------- http://mac4translators.blogspot.com @brandelune [-- Attachment #1.2: Type: text/html, Size: 4297 bytes --] [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: simple.patch --] [-- Type: text/x-patch; name="simple.patch", Size: 479 bytes --] --- simple.el 2019-12-20 01:06:16.849343961 +0100 +++ mysimple.el 2019-12-20 01:03:05.212467674 +0100 @@ -127,6 +127,14 @@ :safe #'booleanp :version "27.1") +(defcustom emacs-lisp-allow-literal-comments nil + "If not nil, elisp will allow you to type in top-level comments + without using semicolon." + :group 'lisp + :type 'boolean + :safe #'booleanp + :version "27.1") + (defvar next-error-highlight-timer nil) (defvar next-error-overlay-arrow-position nil) [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #3: lread.patch --] [-- Type: text/x-patch; name="lread.patch", Size: 906 bytes --] --- lread.c 2019-12-20 01:07:33.264089317 +0100 +++ mylread.c 2019-12-20 01:02:38.605308850 +0100 @@ -1955,6 +1955,8 @@ /* True on the first time around. */ bool first_sexp = 1; Lisp_Object macroexpand = intern ("internal-macroexpand-for-load"); + Lisp_Object litcode = intern ("emacs-lisp-allow-literal-comments"); + Lisp_Object allow_literal_comments = find_symbol_value(litcode); if (NILP (Ffboundp (macroexpand)) || (STRINGP (sourcename) && suffix_p (sourcename, ".elc"))) @@ -2053,6 +2055,15 @@ || c == NO_BREAK_SPACE) goto read_next; + if (EQ (allow_literal_comments, Qt)) + { + if (c != '(' && c != '#') + { + while ((c = READCHAR) != '\n' && c != -1); + goto read_next; + } + } + if (! HASH_TABLE_P (read_objects_map) || XHASH_TABLE (read_objects_map)->count) read_objects_map [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #4: bytecomp.patch --] [-- Type: text/x-patch; name="bytecomp.patch", Size: 3207 bytes --] --- bytecomp.el 2019-12-20 01:05:44.575414147 +0100 +++ mybytecomp.el 2019-12-20 01:03:24.409489389 +0100 @@ -154,6 +154,14 @@ :type '(choice (const nil) function) :version "23.2") +(defcustom byte-compile-allow-literal-comments nil + "If not nil, byte compiler will allow you to type + top-level comments without using semicolon in emacs lisp." + :group 'bytecomp + :type 'boolean + :safe #'booleanp + :version "27.1") + ;; This enables file name handlers such as jka-compr ;; to remove parts of the file name that should not be copied ;; through to the output file name. @@ -2079,8 +2087,8 @@ (print-level nil) ;; Prevent edebug from interfering when we compile ;; and put the output into a file. -;; (edebug-all-defs nil) -;; (edebug-all-forms nil) + ;; (edebug-all-defs nil) + ;; (edebug-all-forms nil) ;; Simulate entry to byte-compile-top-level (byte-compile-jump-tables nil) (byte-compile-constants nil) @@ -2127,19 +2135,35 @@ (= (following-char) ?\;)) (forward-line 1)) (not (eobp))) - (setq byte-compile-read-position (point) + + (setq byte-compile-read-position (point) byte-compile-last-position byte-compile-read-position) - (let* ((lread--unescaped-character-literals nil) - (form (read inbuffer)) - (warning (byte-run--unescaped-character-literals-warning))) - (when warning (byte-compile-warn "%s" warning)) - (byte-compile-toplevel-file-form form))) - ;; Compile pending forms at end of file. - (byte-compile-flush-pending) - ;; Make warnings about unresolved functions - ;; give the end of the file as their position. - (setq byte-compile-last-position (point-max)) - (byte-compile-warn-about-unresolved-functions)) + + (if byte-compile-allow-literal-comments + (progn + (if (or (= (following-char) ?\() + (= (following-char) ?\#) + (= (following-char) ?\')) + (progn + (let* ((lread--unescaped-character-literals nil) + (form (read inbuffer)) + (warning (byte-run--unescaped-character-literals-warning))) + (when warning (byte-compile-warn "%s" warning)) + (byte-compile-toplevel-file-form form))) + (forward-line 1))) + (progn + (let* ((lread--unescaped-character-literals nil) + (form (read inbuffer)) + (warning (byte-run--unescaped-character-literals-warning))) + (when warning (byte-compile-warn "%s" warning)) + (byte-compile-toplevel-file-form form))))) + + ;; Compile pending forms at end of file. + (byte-compile-flush-pending) + ;; Make warnings about unresolved functions + ;; give the end of the file as their position. + (setq byte-compile-last-position (point-max)) + (byte-compile-warn-about-unresolved-functions)) ;; Fix up the header at the front of the output ;; if the buffer contains multibyte characters. (and byte-compile-current-file [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #5: chatty.el --] [-- Type: text/x-emacs-lisp; name="chatty.el", Size: 524 bytes --] Elisp now alows comments without ;. (setq emacs-lisp-allow-literal-comments nil) (setq byte-compile-allow-literal-comments nil) (message "Hello, World!") It is of course possible to intertwene code with comments anywhere in the file. (message "Hello Again!") Of course we can also comment-out code just as before: ;;(message "I am silent") In code blocs the ';' is still a comment delimiter: (message ;; Here is a line commne "I am a bit chatty today!") That's it for today folks! (message "Bye bye cruel world!") ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Christmas wish: Literate Elisp 2019-12-20 0:55 ` Sv: " arthur miller @ 2019-12-20 15:00 ` Stefan Monnier 2019-12-20 15:50 ` Stefan Monnier 2019-12-20 15:50 ` Sv: " arthur miller 0 siblings, 2 replies; 45+ messages in thread From: Stefan Monnier @ 2019-12-20 15:00 UTC (permalink / raw) To: arthur miller; +Cc: emacs-devel@gnu.org Of course, this decision is not up to me, but I'll point out that I think I don't think we should change the C code to or the byte-compiler to directly support this new format. I'd welcome changes that add hooks to make it possible/easier to support such a format (and other formats like Org-mode), OTOH. Stefan arthur miller [2019-12-20 00:55:29] wrote: > Here is a little prototype to test my idea with literal Elisp. > > I have patched read-eval loop as stated in previous mail, in lread.c. > It is probably possible to implement that in Elisp, but I don't have > enough knowledge of either Emacs internals nor Elisp to do this in some > short time. It would took me a lot of time to look up all the > things I would need. Anyway, C code turned to be rather trivial, and also > completely by-passable if so desired, so I have introduced a user-customizable > variable 'emacs-lisp-allow-literal-comments', which is by default nil. > > I wasn't sure in which elisp file to introduce this variable, so I have used > 'simple.el' found in lisp directory of Emacs source distribution. That file > seems to have some other user customizable variables that affect elisp so I > thought it might be appropriate place. > > For the byte compiler I have patched bytecomp.el, in rather brutish way, but it > seems to work. It wasn't very difficult either, but I think I have done it rather > ugly. Someone might wish to refactor that code. Anyway, it is less then > twenty lines of code, and it is by default bypassed as well. The variable > that controls it is also user customizable and found in same file, > named 'byte-comp-allow-literal-comments'. > > I have attached also a small trivial elisp file for illustration purpose. > > It is just a test of an idea, and small prototype to show that it might work. > It needs more thorough testing and can probably be implemented in some better > way. > > I have tested on GNU/Linux and Windows. Emacs was able to compile it's own > elisp as well as external packages I use. > > As a note, the change in C is completely backwards compatible. No logical > change to elisp parser happens when 'emacs-lisp-allow-literal-comments' > variable is nil. > > ________________________________ > Från: Emacs-devel <emacs-devel-bounces+arthur.miller=live.com@gnu.org> för > Jean-Christophe Helary <jean.christophe.helary@traduction-libre.org> > Skickat: den 19 december 2019 02:50 > Till: emacs-devel@gnu.org <emacs-devel@gnu.org> > Ämne: Re: Christmas wish: Literate Elisp > > > >> On Dec 19, 2019, at 9:42, chad <yandros@gmail.com> wrote: >> >> There is a large body of existing software which will be totally unaware of your changes. > > Although I think the premise of your comment is absolutely valid, I'm not so > sure about the "*large* body of existing software". > > > Jean-Christophe Helary > ----------------------------------------------- > http://mac4translators.blogspot.com @brandelune ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Christmas wish: Literate Elisp 2019-12-20 15:00 ` Stefan Monnier @ 2019-12-20 15:50 ` Stefan Monnier 2019-12-20 15:50 ` Sv: " arthur miller 1 sibling, 0 replies; 45+ messages in thread From: Stefan Monnier @ 2019-12-20 15:50 UTC (permalink / raw) To: arthur miller; +Cc: emacs-devel@gnu.org > Of course, this decision is not up to me, but I'll point out that > I think I don't think we should change the C code to or the ^^^^^^^^^^^^^^^^^^^^^ Do I think? Stefan ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Sv: Christmas wish: Literate Elisp 2019-12-20 15:00 ` Stefan Monnier 2019-12-20 15:50 ` Stefan Monnier @ 2019-12-20 15:50 ` arthur miller 2019-12-20 16:17 ` Stefan Monnier 1 sibling, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-20 15:50 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 5181 bytes --] I really understand the concern, but I must ask how would one change the elisp itself without re-implementing much or some of of elisp parser if it would be done externally? The read-eval loop is not exposed to elisp, so one would need to implement own? Or am I missunderstanding? As I understand the elisps read-eval loop is part of C runtime core, so if one would implement another parser on top of it, it would mean some kind of preprocessor to preprocess elisp before it is handled into elisp parser. Thisis only for read-eval loop. I believe it would mean lots of work, and maybe less efficiency since it might impose some extra copying/reading? I don't know, as I noted before I am not that very wellacquinted with Emacs internals so I can't tell for sure. Personally I don't care in which way it is implemented as long as the result is the same. Just as a note about the C change and hooks and runtime support: the flag I used lets me completely bypass the change to the "old" parser. Skipping comment lines is hard coded into read-eval loop, so I have just hacked around it, but if one would introduce some kind of modifiable read-eval loop with hooks or I don't know what then it would probably need more C changes than waht I did. Byte compiler would also need some change since comments are hardcoded there as well. Also if one not introduce any change in byte compiler and read eval loop, it might mean one would preprocess elisp source in some hook, which might need extra loop through source file which is less effecient. At least that is how I am reading the code, but I just started to hack it, so I might be missing something. If one added a buffer-local flag instead of as I did a global flag, then this could be that support in runtime to make it possible/easier to support this. I don't know, I might be wrong, just as I see the code as of the moment. ________________________________ Från: Stefan Monnier <monnier@iro.umontreal.ca> Skickat: den 20 december 2019 16:00 Till: arthur miller <arthur.miller@live.com> Kopia: emacs-devel@gnu.org <emacs-devel@gnu.org> Ämne: Re: Sv: Christmas wish: Literate Elisp Of course, this decision is not up to me, but I'll point out that I think I don't think we should change the C code to or the byte-compiler to directly support this new format. I'd welcome changes that add hooks to make it possible/easier to support such a format (and other formats like Org-mode), OTOH. Stefan arthur miller [2019-12-20 00:55:29] wrote: > Here is a little prototype to test my idea with literal Elisp. > > I have patched read-eval loop as stated in previous mail, in lread.c. > It is probably possible to implement that in Elisp, but I don't have > enough knowledge of either Emacs internals nor Elisp to do this in some > short time. It would took me a lot of time to look up all the > things I would need. Anyway, C code turned to be rather trivial, and also > completely by-passable if so desired, so I have introduced a user-customizable > variable 'emacs-lisp-allow-literal-comments', which is by default nil. > > I wasn't sure in which elisp file to introduce this variable, so I have used > 'simple.el' found in lisp directory of Emacs source distribution. That file > seems to have some other user customizable variables that affect elisp so I > thought it might be appropriate place. > > For the byte compiler I have patched bytecomp.el, in rather brutish way, but it > seems to work. It wasn't very difficult either, but I think I have done it rather > ugly. Someone might wish to refactor that code. Anyway, it is less then > twenty lines of code, and it is by default bypassed as well. The variable > that controls it is also user customizable and found in same file, > named 'byte-comp-allow-literal-comments'. > > I have attached also a small trivial elisp file for illustration purpose. > > It is just a test of an idea, and small prototype to show that it might work. > It needs more thorough testing and can probably be implemented in some better > way. > > I have tested on GNU/Linux and Windows. Emacs was able to compile it's own > elisp as well as external packages I use. > > As a note, the change in C is completely backwards compatible. No logical > change to elisp parser happens when 'emacs-lisp-allow-literal-comments' > variable is nil. > > ________________________________ > Från: Emacs-devel <emacs-devel-bounces+arthur.miller=live.com@gnu.org> för > Jean-Christophe Helary <jean.christophe.helary@traduction-libre.org> > Skickat: den 19 december 2019 02:50 > Till: emacs-devel@gnu.org <emacs-devel@gnu.org> > Ämne: Re: Christmas wish: Literate Elisp > > > >> On Dec 19, 2019, at 9:42, chad <yandros@gmail.com> wrote: >> >> There is a large body of existing software which will be totally unaware of your changes. > > Although I think the premise of your comment is absolutely valid, I'm not so > sure about the "*large* body of existing software". > > > Jean-Christophe Helary > ----------------------------------------------- > http://mac4translators.blogspot.com @brandelune [-- Attachment #2: Type: text/html, Size: 10579 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Sv: Christmas wish: Literate Elisp 2019-12-20 15:50 ` Sv: " arthur miller @ 2019-12-20 16:17 ` Stefan Monnier 2019-12-20 16:34 ` Eduardo Ochs [not found] ` <VI1P194MB0429A123183C15AF8EC3956B962C0@VI1P194MB0429.EURP194.PROD.OUTLOOK.COM> 0 siblings, 2 replies; 45+ messages in thread From: Stefan Monnier @ 2019-12-20 16:17 UTC (permalink / raw) To: arthur miller; +Cc: emacs-devel@gnu.org > I really understand the concern, but I must ask how would one change the > elisp itself without re-implementing much or some of of elisp parser if it would > be done externally? I recommend you take a look at the existing function used on load-source-file-function (i.e. load-with-code-conversion): it loads the source file into a buffer and then calls `eval-buffer`. So all it would take is for you to erase the text (aka non-code) part of the source code before passing it to `eval-buffer` (but of course, only do it when that source is using your new format). Or instead of `eval-buffer` you might "manually" skip the text parts, then use `read` + `eval` on the code parts. This would probably take a bit more effort in order to correctly handle (defvar foo). Stefan ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Sv: Christmas wish: Literate Elisp 2019-12-20 16:17 ` Stefan Monnier @ 2019-12-20 16:34 ` Eduardo Ochs 2019-12-21 1:18 ` Sv: " arthur miller [not found] ` <VI1P194MB0429A123183C15AF8EC3956B962C0@VI1P194MB0429.EURP194.PROD.OUTLOOK.COM> 1 sibling, 1 reply; 45+ messages in thread From: Eduardo Ochs @ 2019-12-20 16:34 UTC (permalink / raw) To: Stefan Monnier; +Cc: arthur miller, emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 1331 bytes --] I was expecting that Arthur would come up with a preprocessor written in (I guess) 30 lines of Elisp... a lot of people would like to play with it, add tests, modify it, and so on - and we could use it to learn how to create our own preprocessors. A preprocessor written as patch to the C source of Emacs feels useless to me. [[]], Eduardo Ochs http://angg.twu.net/#eev http://angg.twu.net/emacsconf2019.html On Fri, 20 Dec 2019 at 13:18, Stefan Monnier <monnier@iro.umontreal.ca> wrote: > > I really understand the concern, but I must ask how would one change the > > elisp itself without re-implementing much or some of of elisp parser if > it would > > be done externally? > > I recommend you take a look at the existing function used on > load-source-file-function (i.e. load-with-code-conversion): it loads the > source file into a buffer and then calls `eval-buffer`. > > So all it would take is for you to erase the text (aka non-code) part of > the source code before passing it to `eval-buffer` (but of course, only > do it when that source is using your new format). > > Or instead of `eval-buffer` you might "manually" skip the text parts, > then use `read` + `eval` on the code parts. This would probably take > a bit more effort in order to correctly handle (defvar foo). > > > Stefan > > > [-- Attachment #2: Type: text/html, Size: 1859 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-20 16:34 ` Eduardo Ochs @ 2019-12-21 1:18 ` arthur miller 2019-12-21 5:24 ` Eduardo Ochs 0 siblings, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-21 1:18 UTC (permalink / raw) To: Eduardo Ochs, Stefan Monnier; +Cc: emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 2455 bytes --] > I was expecting that Arthur would come up with a preprocessor written > in (I guess) 30 lines of Elisp... Interesting 🙂. If you have red my previous mails to this list you might have noticed that I am not an elisp guru. Stefan has outlined two possible ways how this could be implemented in Elisp, if you follow his advice I am sure you will have a working solution you can present to us. I don't care how many lines of code it will take. > a lot of people would like to play > with it, add tests, modify it, and so on You still can my friend, and I encourage you to do and test if the idea itself is valid. That was the purpose why I wrote patch. I clearly stated it is just a prototype of an idea in order to test the soundness of the idea. It takes two minutes to patch 3 files and rebuild Emacs. if you wish to play with it. It is not like it cost some enormous mount of money or labour. > and we could use it to > earn how to create our own preprocessors. There are many sources in Emacs source code or elsewhere you can look at if you need learning material. >A preprocessor written as patch to the C source of Emacs feels useless >to me. The patch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 🙂 [[]], Eduardo Ochs http://angg.twu.net/#eev http://angg.twu.net/emacsconf2019.html On Fri, 20 Dec 2019 at 13:18, Stefan Monnier <monnier@iro.umontreal.ca<mailto:monnier@iro.umontreal.ca>> wrote: > I really understand the concern, but I must ask how would one change the > elisp itself without re-implementing much or some of of elisp parser if it would > be done externally? I recommend you take a look at the existing function used on load-source-file-function (i.e. load-with-code-conversion): it loads the source file into a buffer and then calls `eval-buffer`. So all it would take is for you to erase the text (aka non-code) part of the source code before passing it to `eval-buffer` (but of course, only do it when that source is using your new format). Or instead of `eval-buffer` you might "manually" skip the text parts, then use `read` + `eval` on the code parts. This would probably take a bit more effort in order to correctly handle (defvar foo). Stefan [-- Attachment #2: Type: text/html, Size: 4352 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Sv: Sv: Christmas wish: Literate Elisp 2019-12-21 1:18 ` Sv: " arthur miller @ 2019-12-21 5:24 ` Eduardo Ochs 2019-12-21 5:52 ` Sv: " arthur miller [not found] ` <VI1P194MB042965777086C4466B7FF5EC962C0@VI1P194MB0429.EURP194.PROD.OUTLOOK.COM> 0 siblings, 2 replies; 45+ messages in thread From: Eduardo Ochs @ 2019-12-21 5:24 UTC (permalink / raw) To: arthur miller; +Cc: emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 2885 bytes --] Sorry, I should have written a longer message, with most, or all, parts of it written in the first person... In my experience hanging out at the #emacs channel at Freenode and asking for help or hints on elisp is fun, and it's easy to test ideas interactively with C-x C-e... asking for help on the C side of Emacs is not so fun - patching the C source is considered arcane knowledge (<- my impression!) and fewer people will be able to discuss that and to help... also, I don't know how to recompile Emacs after a change in a .c and restart it in less that 30 seconds (slow machine here - I use an old ThinkPad with LibreBoot) - in fact I don't think I've ever patched the C source before! Here's the script that I used to test Arthur's patch: # Download the attachments of this message: # https://lists.gnu.org/archive/html/emacs-devel/2019-12/msg00556.html # in /tmp/: cd /tmp/ wget -O bytecomp.patch https://lists.gnu.org/archive/html/emacs-devel/2019-12/txtkIKP0OSag7.txt wget -O lread.patch https://lists.gnu.org/archive/html/emacs-devel/2019-12/txttFA8rLAthl.txt wget -O chatty.el https://lists.gnu.org/archive/html/emacs-devel/2019-12/txt6f3pEXMWNI.txt # Apply the patches in /tmp/: cd /tmp/ cp -v ~/bigsrc/emacs/src/lread.c /tmp/ cp -v ~/bigsrc/emacs/lisp/emacs-lisp/bytecomp.el /tmp/ # (find-man "1 patch") patch lread.c lread.patch patch bytecomp.el bytecomp.patch # If they applied cleanly, copy the patched files back: cp -v /tmp/lread.c ~/bigsrc/emacs/src/lread.c cp -v /tmp/bytecomp.el ~/bigsrc/emacs/lisp/emacs-lisp/bytecomp.el # Rebuild Emacs. # I usually skip some of the steps below - my way of executing # these scripts line by line from Emacs is explained here: # http://angg.twu.net/emacsconf2019.html # http://angg.twu.net/eev-intros/find-eev-quick-intro.html#6 rm -Rfv ~/bigsrc/emacs/ mkdir -p ~/bigsrc/emacs/ cd ~/bigsrc/ git clone git://git.sv.gnu.org/emacs cd ~/bigsrc/emacs/ time ./autogen.sh 2>&1 | tee oa time ./configure 2>&1 | tee oc time make bootstrap 2>&1 | tee omb time make 2>&1 | tee om # Run the new Emacs: ~/bigsrc/emacs/src/emacs Cheers, Eduardo Ochs http://angg.twu.net/#eev On Fri, 20 Dec 2019 at 22:18, arthur miller <arthur.miller@live.com> wrote: > > I was expecting that Arthur would come up with a preprocessor written > > in (I guess) 30 lines of Elisp... > > Interesting 🙂. If you have red my previous mails to this list you > might have noticed that I am not an elisp guru. Stefan has > outlined two possible ways how this could be implemented in > Elisp, if you follow his advice I am sure you will have a working > solution you can present to us. I don't care how many lines of code > it will take. > > (...) > [-- Attachment #2: Type: text/html, Size: 4798 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Sv: Sv: Christmas wish: Literate Elisp 2019-12-21 5:24 ` Eduardo Ochs @ 2019-12-21 5:52 ` arthur miller [not found] ` <VI1P194MB042965777086C4466B7FF5EC962C0@VI1P194MB0429.EURP194.PROD.OUTLOOK.COM> 1 sibling, 0 replies; 45+ messages in thread From: arthur miller @ 2019-12-21 5:52 UTC (permalink / raw) To: Eduardo Ochs; +Cc: emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 2862 bytes --] > In my experience hanging out at the #emacs channel at Freenode and > asking for help or hints on elisp is fun, and it's easy to test ideas > interactively with C-x C-e... Indeed, completely agree! > I don't know how to recompile Emacs after a change in > a .c and restart it in less that 30 seconds I don't know either 🙂. It take me about 2 - 3 minutes every time to recompile. I have my emacs src from github and I just run make -j4 after a change. I don't run full build. I then run emacs from src folder with -Q flag and test file as argument. > wget -O bytecomp.patch https://lists.gnu.org/archive/html/emacs-devel/2019-12/txtkIKP0OSag7.txt > wget -O lread.patch https://lists.gnu.org/archive/html/emacs-devel/2019-12/txttFA8rLAthl.txt > wget -O chatty.el https://lists.gnu.org/archive/html/emacs-devel/2019-12/txt6f3pEXMWNI.txt You will also need simple.patch. Contains a variable to turn off/on parser in eval so you can just eval-buffer or eval-region. Cool if you test! I would be glad to hear opinions on the idea of literal elisp. (Please I am aware of opinions on implementation 🙂). # Apply the patches in /tmp/: cd /tmp/ cp -v ~/bigsrc/emacs/src/lread.c /tmp/ cp -v ~/bigsrc/emacs/lisp/emacs-lisp/bytecomp.el /tmp/ # (find-man "1 patch") patch lread.c lread.patch patch bytecomp.el bytecomp.patch # If they applied cleanly, copy the patched files back: cp -v /tmp/lread.c ~/bigsrc/emacs/src/lread.c cp -v /tmp/bytecomp.el ~/bigsrc/emacs/lisp/emacs-lisp/bytecomp.el # Rebuild Emacs. # I usually skip some of the steps below - my way of executing # these scripts line by line from Emacs is explained here: # http://angg.twu.net/emacsconf2019.html # http://angg.twu.net/eev-intros/find-eev-quick-intro.html#6 rm -Rfv ~/bigsrc/emacs/ mkdir -p ~/bigsrc/emacs/ cd ~/bigsrc/ git clone git://git.sv.gnu.org/emacs<http://git.sv.gnu.org/emacs> cd ~/bigsrc/emacs/ time ./autogen.sh 2>&1 | tee oa time ./configure 2>&1 | tee oc time make bootstrap 2>&1 | tee omb time make 2>&1 | tee om # Run the new Emacs: ~/bigsrc/emacs/src/emacs Cheers, Eduardo Ochs http://angg.twu.net/#eev On Fri, 20 Dec 2019 at 22:18, arthur miller <arthur.miller@live.com<mailto:arthur.miller@live.com>> wrote: > I was expecting that Arthur would come up with a preprocessor written > in (I guess) 30 lines of Elisp... Interesting 🙂. If you have red my previous mails to this list you might have noticed that I am not an elisp guru. Stefan has outlined two possible ways how this could be implemented in Elisp, if you follow his advice I am sure you will have a working solution you can present to us. I don't care how many lines of code it will take. (...) [-- Attachment #2: Type: text/html, Size: 5858 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
[parent not found: <VI1P194MB042965777086C4466B7FF5EC962C0@VI1P194MB0429.EURP194.PROD.OUTLOOK.COM>]
* Sv: Sv: Sv: Christmas wish: Literate Elisp [not found] ` <VI1P194MB042965777086C4466B7FF5EC962C0@VI1P194MB0429.EURP194.PROD.OUTLOOK.COM> @ 2019-12-21 15:29 ` arthur miller 0 siblings, 0 replies; 45+ messages in thread From: arthur miller @ 2019-12-21 15:29 UTC (permalink / raw) To: emacs-devel [-- Attachment #1: Type: text/plain, Size: 3740 bytes --] As info; my bytecomp patch has bug, don't use it (just don't bytecompile) when you test, last version won't produce .elc file. I don't have time to fix it today. C patch works fine (with eval-buffer or eval-region ). /a ________________________________ Från: arthur miller <arthur.miller@live.com> Skickat: den 21 december 2019 07:02 Till: Eduardo Ochs <eduardoochs@gmail.com> Ämne: Sv: Sv: Sv: Christmas wish: Literate Elisp Here are all 4 files again with simple.patch for lisp/simple.el. Hope it works for you. cheers /a ________________________________ Från: Eduardo Ochs <eduardoochs@gmail.com> Skickat: den 21 december 2019 06:24 Till: arthur miller <arthur.miller@live.com> Kopia: emacs-devel@gnu.org <emacs-devel@gnu.org> Ämne: Re: Sv: Sv: Christmas wish: Literate Elisp Sorry, I should have written a longer message, with most, or all, parts of it written in the first person... In my experience hanging out at the #emacs channel at Freenode and asking for help or hints on elisp is fun, and it's easy to test ideas interactively with C-x C-e... asking for help on the C side of Emacs is not so fun - patching the C source is considered arcane knowledge (<- my impression!) and fewer people will be able to discuss that and to help... also, I don't know how to recompile Emacs after a change in a .c and restart it in less that 30 seconds (slow machine here - I use an old ThinkPad with LibreBoot) - in fact I don't think I've ever patched the C source before! Here's the script that I used to test Arthur's patch: # Download the attachments of this message: # https://lists.gnu.org/archive/html/emacs-devel/2019-12/msg00556.html # in /tmp/: cd /tmp/ wget -O bytecomp.patch https://lists.gnu.org/archive/html/emacs-devel/2019-12/txtkIKP0OSag7.txt wget -O lread.patch https://lists.gnu.org/archive/html/emacs-devel/2019-12/txttFA8rLAthl.txt wget -O chatty.el https://lists.gnu.org/archive/html/emacs-devel/2019-12/txt6f3pEXMWNI.txt # Apply the patches in /tmp/: cd /tmp/ cp -v ~/bigsrc/emacs/src/lread.c /tmp/ cp -v ~/bigsrc/emacs/lisp/emacs-lisp/bytecomp.el /tmp/ # (find-man "1 patch") patch lread.c lread.patch patch bytecomp.el bytecomp.patch # If they applied cleanly, copy the patched files back: cp -v /tmp/lread.c ~/bigsrc/emacs/src/lread.c cp -v /tmp/bytecomp.el ~/bigsrc/emacs/lisp/emacs-lisp/bytecomp.el # Rebuild Emacs. # I usually skip some of the steps below - my way of executing # these scripts line by line from Emacs is explained here: # http://angg.twu.net/emacsconf2019.html # http://angg.twu.net/eev-intros/find-eev-quick-intro.html#6 rm -Rfv ~/bigsrc/emacs/ mkdir -p ~/bigsrc/emacs/ cd ~/bigsrc/ git clone git://git.sv.gnu.org/emacs<http://git.sv.gnu.org/emacs> cd ~/bigsrc/emacs/ time ./autogen.sh 2>&1 | tee oa time ./configure 2>&1 | tee oc time make bootstrap 2>&1 | tee omb time make 2>&1 | tee om # Run the new Emacs: ~/bigsrc/emacs/src/emacs Cheers, Eduardo Ochs http://angg.twu.net/#eev On Fri, 20 Dec 2019 at 22:18, arthur miller <arthur.miller@live.com<mailto:arthur.miller@live.com>> wrote: > I was expecting that Arthur would come up with a preprocessor written > in (I guess) 30 lines of Elisp... Interesting 🙂. If you have red my previous mails to this list you might have noticed that I am not an elisp guru. Stefan has outlined two possible ways how this could be implemented in Elisp, if you follow his advice I am sure you will have a working solution you can present to us. I don't care how many lines of code it will take. (...) [-- Attachment #2: Type: text/html, Size: 8494 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
[parent not found: <VI1P194MB0429A123183C15AF8EC3956B962C0@VI1P194MB0429.EURP194.PROD.OUTLOOK.COM>]
[parent not found: <jwv7e2pln3s.fsf-monnier+emacs@gnu.org>]
[parent not found: <VI1P194MB0429F37A29A2720037CAD9F9962C0@VI1P194MB0429.EURP194.PROD.OUTLOOK.COM>]
* Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp [not found] ` <VI1P194MB0429F37A29A2720037CAD9F9962C0@VI1P194MB0429.EURP194.PROD.OUTLOOK.COM> @ 2019-12-22 7:01 ` arthur miller 0 siblings, 0 replies; 45+ messages in thread From: arthur miller @ 2019-12-22 7:01 UTC (permalink / raw) To: emacs-devel [-- Attachment #1.1: Type: text/plain, Size: 3101 bytes --] My 2nd patch was wrong as I noticed too late yesterady, sorry for that. Unfortunately I didn't have time to fix it. Here is one that works (at least in my emacs), if any one would like to test the idea and play with idea of using literal elisp. It is not only about being able to omit ';' in comments. The idea is that normally in elisp, compiler skips comment-lines and evaluate everything else. Here compiler evaluates code-lines and skips everythign else. While it might seems like a same thing, it is not! There is a certain inversion and slight difference because of that apparently subtle difference. For instance, sine but code is ignored, this lets one use org-mode as a kind of annotation tool or organisational tool for the code. Normally the parser would choke and produced error messages if it was feeded with org headings and so n. Another possibility is to maybe be able use elisp as a template or annotation language or code generator for some other languages. For example one could write a C code and use elisp macros or code generators which expand to C after eval-buffer, kind -of what org-mode does, but it would maybe make it easier or open some more possibilites if one combines org-mode with directly evaluable elisp. Don't know, haven't had time yet. Anyway, I hope you can give it a try and discuss the idea not the implementeation, implementation is just a sketch to give you something to play with. It is unnecessary to theorycraft essays about all kind of space problems before one tries it, in my opinion. Cheers ________________________________ Från: arthur miller <arthur.miller@live.com> Skickat: den 21 december 2019 17:03 Till: Stefan Monnier <monnier@iro.umontreal.ca> Ämne: Sv: Sv: Sv: Sv: Christmas wish: Literate Elisp > I personally would oppose these few-lines of new code in lread.c at > least until this new feature is properly supported in the rest of the > Elisp-manipulating tools we have (starting with the byte-compiler, but > including checkdoc, autoload, ...) and until there's some clear evidence > that it's useful (i.e. used by more than one person). Completely agree on that one. Unfortunately the time and effort and my struggle to just patch bytecompiler.el to do this tells me I am not the right person to jump on implementing "the skip" approach you suggest. Maybe some code, or at least approach used in bytecompiler and eval can be even reused for this, but to me personally it would take too much time and effort. The other approach of copying file to temp buffer and modifying the file is certainly less jobb and easier to implement. I also agree that it is suitable for small toys and demo examples. It couldn't be difficult to implement, one would need to keep track of balanced paranthesis + some few other small things which isn't very difficult. While I can certainly hack elisp to a degree, I am still not the right person to implement something you would distribute in Emacs anyway, so if somebod else is interesting to implement this approach it would be great. [-- Attachment #1.2: Type: text/html, Size: 8056 bytes --] [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: lread.patch --] [-- Type: text/x-patch; name="lread.patch", Size: 1067 bytes --] --- lread.c 2019-12-20 01:07:33.264089317 +0100 +++ mylread.c 2019-12-22 07:35:31.479305940 +0100 @@ -1955,6 +1955,8 @@ /* True on the first time around. */ bool first_sexp = 1; Lisp_Object macroexpand = intern ("internal-macroexpand-for-load"); + Lisp_Object litcode = intern ("emacs-lisp-allow-literal-comments"); + Lisp_Object allow_literal_comments = find_symbol_value(litcode); if (NILP (Ffboundp (macroexpand)) || (STRINGP (sourcename) && suffix_p (sourcename, ".elc"))) @@ -2053,6 +2055,20 @@ || c == NO_BREAK_SPACE) goto read_next; + if (EQ (allow_literal_comments, Qt)) + { + if (c != '(') + { + if(c == '#' || c == '\'' || c == '\`') c = READCHAR; + if(c == '(') UNREAD(c); + else + { + while ((c = READCHAR) != '\n' && c != -1); + goto read_next; + } + } + } + if (! HASH_TABLE_P (read_objects_map) || XHASH_TABLE (read_objects_map)->count) read_objects_map [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #3: bytecomp.patch --] [-- Type: text/x-patch; name="bytecomp.patch", Size: 3106 bytes --] --- bytecomp.el 2019-12-20 01:05:44.575414147 +0100 +++ mybytecomp.el 2019-12-22 07:35:59.509753178 +0100 @@ -154,6 +154,14 @@ :type '(choice (const nil) function) :version "23.2") +(defcustom byte-compile-allow-literal-comments nil + "If not nil, byte compiler will allow you to type + top-level comments without using semicolon in emacs lisp." + :group 'bytecomp + :type 'boolean + :safe #'booleanp + :version "27.1") + ;; This enables file name handlers such as jka-compr ;; to remove parts of the file name that should not be copied ;; through to the output file name. @@ -2079,8 +2087,8 @@ (print-level nil) ;; Prevent edebug from interfering when we compile ;; and put the output into a file. -;; (edebug-all-defs nil) -;; (edebug-all-forms nil) + ;; (edebug-all-defs nil) + ;; (edebug-all-forms nil) ;; Simulate entry to byte-compile-top-level (byte-compile-jump-tables nil) (byte-compile-constants nil) @@ -2127,19 +2135,35 @@ (= (following-char) ?\;)) (forward-line 1)) (not (eobp))) - (setq byte-compile-read-position (point) + + (setq byte-compile-read-position (point) byte-compile-last-position byte-compile-read-position) - (let* ((lread--unescaped-character-literals nil) - (form (read inbuffer)) - (warning (byte-run--unescaped-character-literals-warning))) - (when warning (byte-compile-warn "%s" warning)) - (byte-compile-toplevel-file-form form))) - ;; Compile pending forms at end of file. - (byte-compile-flush-pending) - ;; Make warnings about unresolved functions - ;; give the end of the file as their position. - (setq byte-compile-last-position (point-max)) - (byte-compile-warn-about-unresolved-functions)) + + (if byte-compile-allow-literal-comments + (progn + (if (= (following-char) ?\() + (progn + + (let* ((lread--unescaped-character-literals nil) + (form (read inbuffer)) + (warning (byte-run--unescaped-character-literals-warning))) + (when warning (byte-compile-warn "%s" warning)) + (byte-compile-toplevel-file-form form))) + (forward-line 1))) + (progn + + (let* ((lread--unescaped-character-literals nil) + (form (read inbuffer)) + (warning (byte-run--unescaped-character-literals-warning))) + (when warning (byte-compile-warn "%s" warning)) + (byte-compile-toplevel-file-form form))))) + + ;; Compile pending forms at end of file. + (byte-compile-flush-pending) + ;; Make warnings about unresolved functions + ;; give the end of the file as their position. + (setq byte-compile-last-position (point-max)) + (byte-compile-warn-about-unresolved-functions)) ;; Fix up the header at the front of the output ;; if the buffer contains multibyte characters. (and byte-compile-current-file [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #4: simple.patch --] [-- Type: text/x-patch; name="simple.patch", Size: 479 bytes --] --- simple.el 2019-12-20 01:06:16.849343961 +0100 +++ mysimple.el 2019-12-20 01:03:05.212467674 +0100 @@ -127,6 +127,14 @@ :safe #'booleanp :version "27.1") +(defcustom emacs-lisp-allow-literal-comments nil + "If not nil, elisp will allow you to type in top-level comments + without using semicolon." + :group 'lisp + :type 'boolean + :safe #'booleanp + :version "27.1") + (defvar next-error-highlight-timer nil) (defvar next-error-overlay-arrow-position nil) [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #5: chatty.el --] [-- Type: text/x-emacs-lisp; name="chatty.el", Size: 720 bytes --] ;; -*- mode: org; -*- Elisp now alows comments without ;. ' can also use start literal comments with # also works * Some elisp here (setq emacs-lisp-allow-literal-comments t) (setq byte-compile-allow-literal-comments t) (message "I can now run simple elisp on my own!") * More stuff here #+BEGIN_SRC emacs-lisp (message "Hello, World!") #+END_SRC It is of course possible to intertwene code with comments anywhere in the file. (message "Hello Again!") Of course we can also comment-out code just as before: ;;(message "I am silent") In code blocs the ';' is still a comment delimiter: (message ;; Here is a line comment "I am a bit chatty today!") That's it for today folks! (message "Bye bye cruel world!") ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Christmas wish: Literate Elisp 2019-12-12 17:29 ` Stefan Monnier 2019-12-14 4:40 ` Sv: " arthur miller @ 2019-12-20 16:51 ` Phillip Lord 2019-12-21 1:16 ` Tim Cross 1 sibling, 1 reply; 45+ messages in thread From: Phillip Lord @ 2019-12-20 16:51 UTC (permalink / raw) To: arthur miller, emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: >> My proposal is to slightly change Elisp parser to treat lines that start >> with any other printable character but '(' as a start of comment and to >> simply ignore the line, just as it treats ';' as a comment. > > The `sexpresso` Haskell package follows the same idea ;-) > > As for using it in Elisp: I don't think there's anything stopping anyone > from making such a `literate-elisp-mode` and even arrange for `load` to > handle such a file (just like there is already a package that lets > `load` work directly on .org files). > > I'd welcome such a package in GNU ELPA. I'm very late to this thread, for which apologies. My own package, lentic, could achieve this. It's gives you two visualisations of the same file; so one with comment characters, and one without. You can then do the literate part in one mode and the coding part in another. It already supports org-mode delination markers; it could be made to support brackets as a delineator too. Phil ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Christmas wish: Literate Elisp 2019-12-20 16:51 ` Phillip Lord @ 2019-12-21 1:16 ` Tim Cross 2019-12-21 4:24 ` Sv: " arthur miller 0 siblings, 1 reply; 45+ messages in thread From: Tim Cross @ 2019-12-21 1:16 UTC (permalink / raw) To: Phillip Lord; +Cc: arthur miller, emacs-devel [-- Attachment #1: Type: text/plain, Size: 6212 bytes --] I've been watching this thread and resisting adding to it, but feel now might be when I can contribute something useful. This whole discussion seems to centre around some views that literate programming for lisp is a positive way forward and therefore, making changes to both C and Elisp parsing is a good idea if it means we can move to a 'modern' literate programming model with greater ease. As someone who has done literate programming for non-trivial projects (i.e. something other than my .emacs file), I think this assumption needs to be challenged. Literate programming has been around for a long time, but has failed to gain traction. Why? Is it due to the existing tools or is it something more fundamental? I have been a fan of Donald Knuth's work for a long time. When I first came across literate programming in the mid-90s, I thought it sounded really interesting and a potentially great approach to writing code. A few of us adopted this approach in our project and embarked on this new path of discovery. Unfortunately, the reality just did not hold up to the promise. Some of this was due to limitations in tooling (relating to the 'weave' and 'tangle' tools of the time), but a big part really just failed because people don't move between prose and code that easily and we don't maintain the prose as well as the code. In the end, you just have lots of out-of-date prose mixed in with your code, which is often more misleading than no prose at all. The tools at the time were particularly poor when it came to working within a REPL type environment. This was partly because they were a two step process (tangling) and you could only go in one direction (getting chagnes made in the REPL back into your source was distracting and often forgotten, so work was frequently lost). Dealing with scope, namespaces etc was a pain in a system which relied on 'tangling' of source files in order to get the final output and nearly all supporting utilities (code formatters, highlighting, linters etc) were broken. Like others who have posted in this thread, we thought it could all be improved if you could eliminate the weaving/tangling and be free to just write prose within your code, so we tried to do this with the lisp we were using (sorry, can't remember what lisp flavor it was). At first glance, it looked very easy to do - a few tweaks to the parser, some new reader macros and we should be fine. On one level, it did fix some of the issues, but we did find lots of unforeseen edge cases and it added sufficient additional complexity to the whole system that in the end, we decided it just didn't deliver the benefits we had hoped for. At the end of the day, it wasn't the tools or the implementation which killed it - it was simply that literate programming simply didn't fit with how people like to code. It was one of those things which sounds nice in theory, but for most, fails in practice. We did find the approach works better for some languages than others. For example, languages like C, where you have a code, compile, run, test cycle, it wasn't oo bad. However, for languages where you often included a more REPL driven style of devleopment, where lots of devleopment is done as experimentation/refinement at the repl, the paradigm added very little and more often than not, just got in the way. We did find it was useful for smaller tasks and configuration management, but for larger projects, especially with teams of developers, it didn't stand up. So, my advice, for what it is worth is Implement a solution which does NOT require any modifications to either the elisp parser or C code and use it to develop some non-trivial elisp packages. You could probably base it on org-mode. My suspicion is that you will find that after some time, it really doesn't deliver what you hoped. However, if I'm wrong, it will provide the necessary experience and familiarity to help guide a more refined and targeted model for working with literate programming and elisp. Don't under estimate the effort or impact making changes to either the elisp parser or C sources will have. There has been a number of comments in this thread which makes it sound like you would just need to 'tweak' the parser and everything will work. That 'tweaking' is far more complicated than it might seem on the surface. One of the main benefits of lisp dialects is there simple syntax and the idea of code as data. Any changes made to either the syntax or parsing of elisp is going to impact on lots of things, many of which none of us have even thought about yet. My feeling is that if literate programming is a great way forward, this will be evident in the number of people who start using an elisp literate programming mode. If this does turn out to be the case, then we can use the experiences from many people who are using that mode to see what can be done to develop the paradigm further. This may involve low level C or elsip parser or syntax changes, but they will be based on experience and demand. On Sat, 21 Dec 2019 at 03:56, Phillip Lord <phillip.lord@russet.org.uk> wrote: > > > Stefan Monnier <monnier@iro.umontreal.ca> writes: > > >> My proposal is to slightly change Elisp parser to treat lines that start > >> with any other printable character but '(' as a start of comment and to > >> simply ignore the line, just as it treats ';' as a comment. > > > > The `sexpresso` Haskell package follows the same idea ;-) > > > > As for using it in Elisp: I don't think there's anything stopping anyone > > from making such a `literate-elisp-mode` and even arrange for `load` to > > handle such a file (just like there is already a package that lets > > `load` work directly on .org files). > > > > I'd welcome such a package in GNU ELPA. > > > I'm very late to this thread, for which apologies. > > My own package, lentic, could achieve this. It's gives you two > visualisations of the same file; so one with comment characters, and one > without. You can then do the literate part in one mode and the coding > part in another. > > It already supports org-mode delination markers; it could be made to > support brackets as a delineator too. > > Phil > > -- regards, Tim -- Tim Cross [-- Attachment #2: Type: text/html, Size: 7283 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Christmas wish: Literate Elisp 2019-12-21 1:16 ` Tim Cross @ 2019-12-21 4:24 ` arthur miller 2019-12-21 6:41 ` Tim Cross 0 siblings, 1 reply; 45+ messages in thread From: arthur miller @ 2019-12-21 4:24 UTC (permalink / raw) To: Tim Cross, Phillip Lord; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 9998 bytes --] Very interesting and nice read, thank you for taking your time Tim. I have no idea if literate programmign is very good or not.I certainly don't do it much. I never intended to present it as some kind of modern, silver bullet or something. I hope I didn't sound like that. I am aware that it is not the new idea either. Personally I really like ORG-mode and ipossibility to mix languages in one and same file. I was just looking at something I was working with and thought it had so much noise around stuff that matters. I wondered if it could be simplified. Then I got the idea that elisp could actually be written without special markers, since in elisp we put all code between () (with some exceptions). As I stated in my very first mail where I asked if we could have this in Emacs, I am not sure myself if this is somethign very usefull or just a cool gimmick. I personally can see some nice use cases, but it might not be of value to somebody else. I can maybe make a video where I play with it a bit after the hollidays it it is interesting. Yes, you are right about tools, checkers and so on. If we call it "literal elisp" then one thing should be clear: literal elisp and elisp are not same. All elisp is literal elisp, but all literal elsip would not be elisp. Relevance of this should be obvious to anyone, all current tools work with elisp, not literal elisp. So if you open a buffer and type comments without ';' in front, of course, identation, font locking etc will be confused. This should be self evident fact. Literal elisp would be a superset of elisp (with only one extra feature - different handling of comments). This is regardless of implementation language, just as elisp would be same language regardless if interpreter is written in C or Rust or Elisp for that matter. While yes, I have hacked C code, it does not mean I have altered how Elisp works. Elisp is still the very same, so even with the patch all Elisp should still work and parse the very same in Emacs and all external tools as it does since the beginning of the time. Look at the patch, apply it, run it. There is even boolean flag that eliminates that code at run time if desired. I don't know how your lisp and your patches worked, not all Lisps are created equal. It is interesting experience you share, and I do understand what you mean and I agree with you. I am very conservative myself when it comes to making changes, what is not broken should not be repaired. I am also very pragmatic. I don't do changes just for changes sake, I do it only if it does something useful. Also, don't misstake me, I don't insist on change be done in C. I have done those changes the way I did because I am new to Emacs internals hacking. I am not new to programming, but I have no idea how they do in Emacs code, what API calls are there and so on. I also have limited with time. So I have hacked where Emacs self help functionality and debugger has thrown me in. It turned to be some elisp and some C. I am sure it is possible to do this in different ways, and if somebody is willing to implement some other way, please go ahead. Of those two ideas that Stefan outlined, I am not willing to implement them. First one is super brutish and inneficient, the second one is sane but involves too much work. I don't have knowledge and time to put into it. But I am sure it can be done. ________________________________ Från: Tim Cross <theophilusx@gmail.com> Skickat: den 21 december 2019 02:16 Till: Phillip Lord <phillip.lord@russet.org.uk> Kopia: arthur miller <arthur.miller@live.com>; emacs-devel <emacs-devel@gnu.org> Ämne: Re: Christmas wish: Literate Elisp I've been watching this thread and resisting adding to it, but feel now might be when I can contribute something useful. This whole discussion seems to centre around some views that literate programming for lisp is a positive way forward and therefore, making changes to both C and Elisp parsing is a good idea if it means we can move to a 'modern' literate programming model with greater ease. As someone who has done literate programming for non-trivial projects (i.e. something other than my .emacs file), I think this assumption needs to be challenged. Literate programming has been around for a long time, but has failed to gain traction. Why? Is it due to the existing tools or is it something more fundamental? I have been a fan of Donald Knuth's work for a long time. When I first came across literate programming in the mid-90s, I thought it sounded really interesting and a potentially great approach to writing code. A few of us adopted this approach in our project and embarked on this new path of discovery. Unfortunately, the reality just did not hold up to the promise. Some of this was due to limitations in tooling (relating to the 'weave' and 'tangle' tools of the time), but a big part really just failed because people don't move between prose and code that easily and we don't maintain the prose as well as the code. In the end, you just have lots of out-of-date prose mixed in with your code, which is often more misleading than no prose at all. The tools at the time were particularly poor when it came to working within a REPL type environment. This was partly because they were a two step process (tangling) and you could only go in one direction (getting chagnes made in the REPL back into your source was distracting and often forgotten, so work was frequently lost). Dealing with scope, namespaces etc was a pain in a system which relied on 'tangling' of source files in order to get the final output and nearly all supporting utilities (code formatters, highlighting, linters etc) were broken. Like others who have posted in this thread, we thought it could all be improved if you could eliminate the weaving/tangling and be free to just write prose within your code, so we tried to do this with the lisp we were using (sorry, can't remember what lisp flavor it was). At first glance, it looked very easy to do - a few tweaks to the parser, some new reader macros and we should be fine. On one level, it did fix some of the issues, but we did find lots of unforeseen edge cases and it added sufficient additional complexity to the whole system that in the end, we decided it just didn't deliver the benefits we had hoped for. At the end of the day, it wasn't the tools or the implementation which killed it - it was simply that literate programming simply didn't fit with how people like to code. It was one of those things which sounds nice in theory, but for most, fails in practice. We did find the approach works better for some languages than others. For example, languages like C, where you have a code, compile, run, test cycle, it wasn't oo bad. However, for languages where you often included a more REPL driven style of devleopment, where lots of devleopment is done as experimentation/refinement at the repl, the paradigm added very little and more often than not, just got in the way. We did find it was useful for smaller tasks and configuration management, but for larger projects, especially with teams of developers, it didn't stand up. So, my advice, for what it is worth is Implement a solution which does NOT require any modifications to either the elisp parser or C code and use it to develop some non-trivial elisp packages. You could probably base it on org-mode. My suspicion is that you will find that after some time, it really doesn't deliver what you hoped. However, if I'm wrong, it will provide the necessary experience and familiarity to help guide a more refined and targeted model for working with literate programming and elisp. Don't under estimate the effort or impact making changes to either the elisp parser or C sources will have. There has been a number of comments in this thread which makes it sound like you would just need to 'tweak' the parser and everything will work. That 'tweaking' is far more complicated than it might seem on the surface. One of the main benefits of lisp dialects is there simple syntax and the idea of code as data. Any changes made to either the syntax or parsing of elisp is going to impact on lots of things, many of which none of us have even thought about yet. My feeling is that if literate programming is a great way forward, this will be evident in the number of people who start using an elisp literate programming mode. If this does turn out to be the case, then we can use the experiences from many people who are using that mode to see what can be done to develop the paradigm further. This may involve low level C or elsip parser or syntax changes, but they will be based on experience and demand. On Sat, 21 Dec 2019 at 03:56, Phillip Lord <phillip.lord@russet.org.uk<mailto:phillip.lord@russet.org.uk>> wrote: Stefan Monnier <monnier@iro.umontreal.ca<mailto:monnier@iro.umontreal.ca>> writes: >> My proposal is to slightly change Elisp parser to treat lines that start >> with any other printable character but '(' as a start of comment and to >> simply ignore the line, just as it treats ';' as a comment. > > The `sexpresso` Haskell package follows the same idea ;-) > > As for using it in Elisp: I don't think there's anything stopping anyone > from making such a `literate-elisp-mode` and even arrange for `load` to > handle such a file (just like there is already a package that lets > `load` work directly on .org files). > > I'd welcome such a package in GNU ELPA. I'm very late to this thread, for which apologies. My own package, lentic, could achieve this. It's gives you two visualisations of the same file; so one with comment characters, and one without. You can then do the literate part in one mode and the coding part in another. It already supports org-mode delination markers; it could be made to support brackets as a delineator too. Phil -- regards, Tim -- Tim Cross [-- Attachment #2: Type: text/html, Size: 19717 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Christmas wish: Literate Elisp 2019-12-21 4:24 ` Sv: " arthur miller @ 2019-12-21 6:41 ` Tim Cross 2019-12-21 9:39 ` VanL 0 siblings, 1 reply; 45+ messages in thread From: Tim Cross @ 2019-12-21 6:41 UTC (permalink / raw) To: arthur miller; +Cc: emacs-devel, Phillip Lord [-- Attachment #1: Type: text/plain, Size: 12160 bytes --] I certainly don't want to discourage you from experimenting and trying out ideas - this is what makes Emacs great. What I would encourage is, in this case, using org-mode to develop something non-trivial (possibly your literate elsip idea) as it will give you the elisp experience you need and more importantly, a taste of a form of literate programming, which will both highlight the limitations of the current implementation (ie.e. org-mode) and possibly, the literate programming approach itself. The key point is that it needs to be non-trivial. Most of the limitations I found with literate programming really only become evident in larger projects. For smaller things, it works great and it is how I maintain my own init.el file. It is only when you do something more complex that weaknesses become evident. I would also highly recommend re-visiting Stepan's posts after you have gained some more elisp experience. Stephan is one of the most experienced and knowledgeable contributors on this list. His advice and guidance are valuable and should be considered carefully. While it may not be obvious why he is making a recommendation, you can be fairly confident it is based on experience and deep knowledge of Emacs. Spending the time to analyze his suggestions and looking into them in detail is likely to save you a lot of time going down dead ends or having to re-design/re-factor things as you discover them the hard way. I hope you don't become too discouraged and do work at implementing your idea. At the very least, you may be able to find ways to improve or enhance org-mode, which is always a valuable contribution. On Sat, 21 Dec 2019 at 15:24, arthur miller <arthur.miller@live.com> wrote: > Very interesting and nice read, thank you for taking your time Tim. > > I have no idea if literate programmign is very good or not.I certainly > don't do it much. I never intended to present it as some kind of modern, > silver bullet or something. I hope I didn't sound like that. I am aware > that it is not the new idea either. > > Personally I really like ORG-mode and ipossibility to mix languages > in one and same file. I was just looking at something I was working > with and thought it had so much noise around stuff that matters. I > wondered if it could be simplified. Then I got the idea that elisp could > actually be written without special markers, since in elisp we put > all code between () (with some exceptions). As I stated in my very first > mail where I asked if we could have this in Emacs, I am not sure myself > if this is somethign very usefull or just a cool gimmick. I personally can > see some nice use cases, but it might not be of value to somebody else. > I can maybe make a video where I play with it a bit after the hollidays it > it is interesting. > > Yes, you are right about tools, checkers and so on. If we call it "literal > elisp" > then one thing should be clear: literal elisp and elisp are not same. All > elisp is literal elisp, but all literal elsip would not be elisp. > Relevance of > this should be obvious to anyone, all current tools work with elisp, not > literal elisp. So if you open a buffer and type comments without ';' in > front, of course, identation, font locking etc will be confused. This > should > be self evident fact. Literal elisp would be a superset of elisp (with only > one extra feature - different handling of comments). This is regardless > of implementation language, just as elisp would be same language > regardless if interpreter is written in C or Rust or Elisp for that > matter. > > While yes, I have hacked C code, it does not mean I have altered how > Elisp works. Elisp is still the very same, so even with the patch all Elisp > should still work and parse the very same in Emacs and all external > tools as it does since the beginning of the time. Look at the patch, apply > it, run it. There is even boolean flag that eliminates that code at run > time > if desired. I don't know how your lisp and your patches worked, not all > Lisps are created equal. It is interesting experience you share, and I do > understand what you mean and I agree with you. I am very conservative > myself when it comes to making changes, what is not broken should not > be repaired. I am also very pragmatic. I don't do changes just for > changes > sake, I do it only if it does something useful. > > Also, don't misstake me, I don't insist on change be done in C. I have done > those changes the way I did because I am new to Emacs internals hacking. > I am not new to programming, but I have no idea how they do in Emacs code, > what API calls are there and so on. I also have limited with time. So I > have > hacked where Emacs self help functionality and debugger has thrown me in. > > It turned to be some elisp and some C. I am sure it is possible to do this > in > different ways, and if somebody is willing to implement some other way, > please go ahead. Of those two ideas that Stefan outlined, I am not willing > to implement them. First one is super brutish and inneficient, the second > one is sane but involves too much work. I don't have knowledge and time > to put into it. But I am sure it can be done. > > ------------------------------ > *Från:* Tim Cross <theophilusx@gmail.com> > *Skickat:* den 21 december 2019 02:16 > *Till:* Phillip Lord <phillip.lord@russet.org.uk> > *Kopia:* arthur miller <arthur.miller@live.com>; emacs-devel < > emacs-devel@gnu.org> > *Ämne:* Re: Christmas wish: Literate Elisp > > I've been watching this thread and resisting adding to it, but feel now > might be when I can contribute something useful. > > This whole discussion seems to centre around some views that literate > programming for lisp is a positive way forward and therefore, making > changes to both C and Elisp parsing is a good idea if it means we can move > to a 'modern' literate programming model with greater ease. > > As someone who has done literate programming for non-trivial projects > (i.e. something other than my .emacs file), I think this assumption needs > to be challenged. Literate programming has been around for a long time, but > has failed to gain traction. Why? Is it due to the existing tools or is it > something more fundamental? > > I have been a fan of Donald Knuth's work for a long time. When I first > came across literate programming in the mid-90s, I thought it sounded > really interesting and a potentially great approach to writing code. A few > of us adopted this approach in our project and embarked on this new path of > discovery. Unfortunately, the reality just did not hold up to the promise. > Some of this was due to limitations in tooling (relating to the 'weave' and > 'tangle' tools of the time), but a big part really just failed because > people don't move between prose and code that easily and we don't maintain > the prose as well as the code. In the end, you just have lots of > out-of-date prose mixed in with your code, which is often more misleading > than no prose at all. > > The tools at the time were particularly poor when it came to working > within a REPL type environment. This was partly because they were a two > step process (tangling) and you could only go in one direction (getting > chagnes made in the REPL back into your source was distracting and often > forgotten, so work was frequently lost). Dealing with scope, namespaces etc > was a pain in a system which relied on 'tangling' of source files in order > to get the final output and nearly all supporting utilities (code > formatters, highlighting, linters etc) were broken. Like others who have > posted in this thread, we thought it could all be improved if you could > eliminate the weaving/tangling and be free to just write prose within your > code, so we tried to do this with the lisp we were using (sorry, can't > remember what lisp flavor it was). At first glance, it looked very easy to > do - a few tweaks to the parser, some new reader macros and we should be > fine. On one level, it did fix some of the issues, but we did find lots of > unforeseen edge cases and it added sufficient additional complexity to the > whole system that in the end, we decided it just didn't deliver the > benefits we had hoped for. At the end of the day, it wasn't the tools or > the implementation which killed it - it was simply that literate > programming simply didn't fit with how people like to code. It was one of > those things which sounds nice in theory, but for most, fails in practice. > > We did find the approach works better for some languages than others. For > example, languages like C, where you have a code, compile, run, test cycle, > it wasn't oo bad. However, for languages where you often included a more > REPL driven style of devleopment, where lots of devleopment is done as > experimentation/refinement at the repl, the paradigm added very little and > more often than not, just got in the way. We did find it was useful for > smaller tasks and configuration management, but for larger projects, > especially with teams of developers, it didn't stand up. > > So, my advice, for what it is worth is > > Implement a solution which does NOT require any modifications to either > the elisp parser or C code and use it to develop some non-trivial elisp > packages. You could probably base it on org-mode. My suspicion is that you > will find that after some time, it really doesn't deliver what you hoped. > However, if I'm wrong, it will provide the necessary experience and > familiarity to help guide a more refined and targeted model for working > with literate programming and elisp. > > Don't under estimate the effort or impact making changes to either the > elisp parser or C sources will have. There has been a number of comments in > this thread which makes it sound like you would just need to 'tweak' the > parser and everything will work. That 'tweaking' is far more complicated > than it might seem on the surface. One of the main benefits of lisp > dialects is there simple syntax and the idea of code as data. Any changes > made to either the syntax or parsing of elisp is going to impact on lots of > things, many of which none of us have even thought about yet. > > My feeling is that if literate programming is a great way forward, this > will be evident in the number of people who start using an elisp literate > programming mode. If this does turn out to be the case, then we can use the > experiences from many people who are using that mode to see what can be > done to develop the paradigm further. This may involve low level C or elsip > parser or syntax changes, but they will be based on experience and demand. > > On Sat, 21 Dec 2019 at 03:56, Phillip Lord <phillip.lord@russet.org.uk> > wrote: > > > > Stefan Monnier <monnier@iro.umontreal.ca> writes: > > >> My proposal is to slightly change Elisp parser to treat lines that start > >> with any other printable character but '(' as a start of comment and to > >> simply ignore the line, just as it treats ';' as a comment. > > > > The `sexpresso` Haskell package follows the same idea ;-) > > > > As for using it in Elisp: I don't think there's anything stopping anyone > > from making such a `literate-elisp-mode` and even arrange for `load` to > > handle such a file (just like there is already a package that lets > > `load` work directly on .org files). > > > > I'd welcome such a package in GNU ELPA. > > > I'm very late to this thread, for which apologies. > > My own package, lentic, could achieve this. It's gives you two > visualisations of the same file; so one with comment characters, and one > without. You can then do the literate part in one mode and the coding > part in another. > > It already supports org-mode delination markers; it could be made to > support brackets as a delineator too. > > Phil > > > > -- > regards, > > Tim > > -- > Tim Cross > > -- regards, Tim -- Tim Cross [-- Attachment #2: Type: text/html, Size: 21330 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Christmas wish: Literate Elisp 2019-12-21 6:41 ` Tim Cross @ 2019-12-21 9:39 ` VanL 2019-12-21 14:17 ` Sv: " arthur miller 0 siblings, 1 reply; 45+ messages in thread From: VanL @ 2019-12-21 9:39 UTC (permalink / raw) To: emacs-devel Tim Cross <theophilusx@gmail.com> writes: > It is only when you do something more complex that weaknesses become > evident. > On Sat, 21 Dec 2019 at 15:24, arthur miller <arthur.miller@live.com> wrote: > > I have no idea if literate programmign is very good or not.I certainly > don't do it much. > I am not sure myself if this is somethign very usefull or just a cool > gimmick. I personally can see some nice use cases, > I am very conservative myself when it comes to making changes, what > is not broken should not be repaired. I am also very pragmatic. I > don't do changes just for changes sake, I do it only if it does > something useful. On Reddit¹, UselessCodeMonkey mentions two of the best development teams at writing software, rated five stars. Learnings from their practices is worth the while to apply if they're not proprietary and offlimits. Footnotes: ¹ https://www.reddit.com/r/spacex/comments/edavxw/boeing_starliner_suffers_offnominal_insertion/ -- VanL., əə0@ 🐞 7 6 4 5 一 二 三 言 語 𝔖 元 示 証 明 海 自 己 漢 本 人 Gnus/Emacs (berkeley-unix) ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Christmas wish: Literate Elisp 2019-12-21 9:39 ` VanL @ 2019-12-21 14:17 ` arthur miller 0 siblings, 0 replies; 45+ messages in thread From: arthur miller @ 2019-12-21 14:17 UTC (permalink / raw) To: VanL, emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 2890 bytes --] 🙂 👍 I have certainly no access to a spaceship 🙁. Unfortunately! If anyone is friends with Elon and can borough one I would certainly love to test my patch to control a spaceship with it! Jokes aside, I have seen those threads myself and have read about Boeings misstakes already. I am also aware about Ariane 5 and Xenobia (which I dived last year) and so on. Yes Tim, Stefan is great guy here, I completely agree with you, I have also been watching this list for years, even if I never post here (I did it once before), as well as Eli Z, RMS and lots of other here. I value their opinion a lot, and I value everybody else's constructive input, such as yours. When it comes to experimenting, that was exactly what I did. I came with idea and I hacked it to see if it is possible. I never suggested it was finnished patch to be included in a final product. I didn't even suggest I would be the one to implement it, I am not an Emacs dev and I certainly have not much knowledge about what and how they do. Anyway patch is simple and there for experimentation, anyone can build a side copy of Emacs and test this if they are curious. It didn't blow up my computer, and while I can't promise, I certainly do hope it won't blow up other peoples computers either, but be careful! 🙂. Anyway, if it is gonna be an Elisp solution or C or whatever language or none solution at all, is left as a homework for interested developer(s). ________________________________ Från: Emacs-devel <emacs-devel-bounces+arthur.miller=live.com@gnu.org> för VanL <van@scratch.space> Skickat: den 21 december 2019 10:39 Till: emacs-devel@gnu.org <emacs-devel@gnu.org> Ämne: Re: Christmas wish: Literate Elisp Tim Cross <theophilusx@gmail.com> writes: > It is only when you do something more complex that weaknesses become > evident. > On Sat, 21 Dec 2019 at 15:24, arthur miller <arthur.miller@live.com> wrote: > > I have no idea if literate programmign is very good or not.I certainly > don't do it much. > I am not sure myself if this is somethign very usefull or just a cool > gimmick. I personally can see some nice use cases, > I am very conservative myself when it comes to making changes, what > is not broken should not be repaired. I am also very pragmatic. I > don't do changes just for changes sake, I do it only if it does > something useful. On Reddit¹, UselessCodeMonkey mentions two of the best development teams at writing software, rated five stars. Learnings from their practices is worth the while to apply if they're not proprietary and offlimits. Footnotes: ¹ https://www.reddit.com/r/spacex/comments/edavxw/boeing_starliner_suffers_offnominal_insertion/ -- VanL., əə0@ 🐞 7 6 4 5 一 二 三 言 語 𝔖 元 示 証 明 海 自 己 漢 本 人 Gnus/Emacs (berkeley-unix) [-- Attachment #2: Type: text/html, Size: 7836 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: Christmas wish: Literate Elisp 2019-12-12 15:45 Christmas wish: Literate Elisp arthur miller 2019-12-12 17:29 ` Stefan Monnier @ 2019-12-14 4:16 ` Richard Stallman 2019-12-14 5:05 ` Sv: " arthur miller 1 sibling, 1 reply; 45+ messages in thread From: Richard Stallman @ 2019-12-14 4:16 UTC (permalink / raw) To: arthur miller; +Cc: emacs-devel [[[ To any NSA and FBI agents reading my email: please consider ]]] [[[ whether defending the US Constitution against all enemies, ]]] [[[ foreign or domestic, requires you to follow Snowden's example. ]]] The idea sounds basically plausible, but note that simply rejecting all lines that start with anything other than ( plus whitespace will give the wrong results. Lisp code includes lines that start with other things. Look at any file of Lisp code and you will see many that start with letters, digits or quotes. The proposal needs to be corrected for this. But I think that correction won't be difficult. Indented comments should be recognized and formatted differently but not exactly the same as interpolated text. Perhaps triple-semicolon should be the marker for interpolated text. That way, it would not require any change in Lisp parsing or in Lisp Mode. -- Dr Richard Stallman Founder, Free Software Foundation (https://gnu.org, https://fsf.org) Internet Hall-of-Famer (https://internethalloffame.org) ^ permalink raw reply [flat|nested] 45+ messages in thread
* Sv: Christmas wish: Literate Elisp 2019-12-14 4:16 ` Richard Stallman @ 2019-12-14 5:05 ` arthur miller 0 siblings, 0 replies; 45+ messages in thread From: arthur miller @ 2019-12-14 5:05 UTC (permalink / raw) To: Richard Stallman; +Cc: emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 2835 bytes --] "The idea sounds basically plausible, but note that simply rejecting all lines that start with anything other than ( plus whitespace will give the wrong results. Lisp code includes lines that start with other things. Look at any file of Lisp code and you will see many that start with letters, digits or quotes. The proposal needs to be corrected for this." To be honest I am not sure if I am a bit not understood here, or just me not being knowledgable enough about lisp (could be both 🙂). I will try to clarify. What I propose is to treat lines that does not belong to a code block (). I don't mean every line that does not start with '('. there can be many lines in a code block between an '(' and final matching ')'. Once '(' is encountered, parsing should be just as it is now, without difference. ';' would still be the comment indicator, so no change needed there. Just for the text that does not belong to any matching pair of (), so to say in-between "block final" ')' and "block opening" '('. I am sorry if my terminology is not very lisp-like, I am used to think more in terms of a C compiler. I am not super-versatile with elisp to be honest, so I will have to ask: is it possible to have elisp that isn't in-between '(' and ')'. Is it possible to have symbols or literals in elisp outside ()? I am sorry if I am total noob, but I am not used to see those in sources, is it just rare to have them, or do I missunderand? I am looking around in some elisp but I can't find any. ________________________________ Från: Richard Stallman <rms@gnu.org> Skickat: den 14 december 2019 05:16 Till: arthur miller <arthur.miller@live.com> Kopia: emacs-devel@gnu.org <emacs-devel@gnu.org> Ämne: Re: Christmas wish: Literate Elisp [[[ To any NSA and FBI agents reading my email: please consider ]]] [[[ whether defending the US Constitution against all enemies, ]]] [[[ foreign or domestic, requires you to follow Snowden's example. ]]] The idea sounds basically plausible, but note that simply rejecting all lines that start with anything other than ( plus whitespace will give the wrong results. Lisp code includes lines that start with other things. Look at any file of Lisp code and you will see many that start with letters, digits or quotes. The proposal needs to be corrected for this. But I think that correction won't be difficult. Indented comments should be recognized and formatted differently but not exactly the same as interpolated text. Perhaps triple-semicolon should be the marker for interpolated text. That way, it would not require any change in Lisp parsing or in Lisp Mode. -- Dr Richard Stallman Founder, Free Software Foundation (https://gnu.org, https://fsf.org) Internet Hall-of-Famer (https://internethalloffame.org) [-- Attachment #2: Type: text/html, Size: 8042 bytes --] ^ permalink raw reply [flat|nested] 45+ messages in thread
end of thread, other threads:[~2019-12-22 7:01 UTC | newest] Thread overview: 45+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2019-12-12 15:45 Christmas wish: Literate Elisp arthur miller 2019-12-12 17:29 ` Stefan Monnier 2019-12-14 4:40 ` Sv: " arthur miller 2019-12-14 14:08 ` Stefan Monnier 2019-12-15 8:37 ` arthur miller 2019-12-16 12:01 ` Sv: " arthur miller 2019-12-16 13:41 ` Stefan Monnier 2019-12-16 14:02 ` Sv: " arthur miller 2019-12-16 16:07 ` Jonathan Leech-Pepin 2019-12-17 2:09 ` arthur miller 2019-12-17 11:06 ` Adam Porter 2019-12-18 16:29 ` Sv: " arthur miller 2019-12-18 18:49 ` Adam Porter 2019-12-18 20:04 ` Sv: " arthur miller 2019-12-18 23:18 ` Adam Porter 2019-12-18 23:53 ` Sv: " arthur miller 2019-12-20 15:58 ` Unknown 2019-12-18 21:18 ` Sv: Sv: Sv: " Stefan Monnier 2019-12-18 22:43 ` Christmas wish: Literate Elisp (Intro) VanL 2019-12-19 0:05 ` Sv: " arthur miller 2019-12-18 22:59 ` Sv: Sv: Sv: Christmas wish: Literate Elisp Adam Porter 2019-12-18 23:18 ` Sv: " arthur miller 2019-12-18 23:52 ` Adam Porter 2019-12-19 0:02 ` Sv: " arthur miller 2019-12-19 0:42 ` chad 2019-12-19 1:50 ` Jean-Christophe Helary 2019-12-20 0:55 ` Sv: " arthur miller 2019-12-20 15:00 ` Stefan Monnier 2019-12-20 15:50 ` Stefan Monnier 2019-12-20 15:50 ` Sv: " arthur miller 2019-12-20 16:17 ` Stefan Monnier 2019-12-20 16:34 ` Eduardo Ochs 2019-12-21 1:18 ` Sv: " arthur miller 2019-12-21 5:24 ` Eduardo Ochs 2019-12-21 5:52 ` Sv: " arthur miller [not found] ` <VI1P194MB042965777086C4466B7FF5EC962C0@VI1P194MB0429.EURP194.PROD.OUTLOOK.COM> 2019-12-21 15:29 ` arthur miller [not found] ` <VI1P194MB0429A123183C15AF8EC3956B962C0@VI1P194MB0429.EURP194.PROD.OUTLOOK.COM> [not found] ` <jwv7e2pln3s.fsf-monnier+emacs@gnu.org> [not found] ` <VI1P194MB0429F37A29A2720037CAD9F9962C0@VI1P194MB0429.EURP194.PROD.OUTLOOK.COM> 2019-12-22 7:01 ` Sv: " arthur miller 2019-12-20 16:51 ` Phillip Lord 2019-12-21 1:16 ` Tim Cross 2019-12-21 4:24 ` Sv: " arthur miller 2019-12-21 6:41 ` Tim Cross 2019-12-21 9:39 ` VanL 2019-12-21 14:17 ` Sv: " arthur miller 2019-12-14 4:16 ` Richard Stallman 2019-12-14 5:05 ` Sv: " arthur miller
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/emacs.git https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.