From: Yu <yu_icq@gmx.at>
To: Eric Schulte <eric.schulte@gmx.com>,
org-mode mailing list <emacs-orgmode@gnu.org>
Subject: Re: Syntax error warnings? (Especially important with :noweb-ref's)
Date: Mon, 30 Jan 2012 18:59:31 +0100 [thread overview]
Message-ID: <CANtbJLH6wmd876UjEqUReSGahHUGqV9PJ68PjXTqkYz1eK+PiQ@mail.gmail.com> (raw)
In-Reply-To: <87sjixyx7m.fsf@gmx.com>
Hello!
Thanks for the reply. The problem was, that I assumed the list
`org-babel-noweb-error-langs' to require the same form as
`org-babel-load-languages', i.e. something like
: ( (latex . t) (python . t) (sh . t) )
I didn't expect it to require a plain list of strings.
Now, that this misunderstanding is cleared though, the next problem
becomes visible: The common workflow I excepted is:
1. Define an overall structure of the task.
2. Run org-babel-tangle
3. If there are no errors: Finished.
Else:
- Choose the next block to implement from the list of unresolved blocks.
- Rerun from "1."
In the current implementation, the first unresolved code block stops
at the `error' statement.
Idea
------------
Instead of throwing an error, just a warning should be given. A simple
implementation could be replacing, in ob.el,
`org-babel-expand-noweb-references',
(error "%s" (concat
(org-babel-noweb-wrap source-name)
"could not be resolved (see "
"`org-babel-noweb-error-langs')"))
by
(progn
(lwarn 'tangle :warning "%s"
(concat (org-babel-noweb-wrap source-name)
" could not be resolved (see "
"`org-babel-noweb-error-langs')"))
"")
(the (progn-wrapping) is needed to ensure the enclosing if statement
returns a string as expected by `split-string').
The solution has the weakness though, that the warning buffer doesn't
show up automatically (due to the save-excursion I assume, so probably
the warnings should be thrown in one go /after/ the save excursion and
be collected into a list until then. (Multiple advantages:
`add-to-list' can take care of multipli occuring warnings and a single
warning is more clear by far then several warnings).
king regards, Yu
2012/1/30 Eric Schulte <eric.schulte@gmx.com>:
> Yu <yu_icq@gmx.at> writes:
>
>> I tried my test file just again with a fresh pull from git:
>>
>> : `cat << file1 >> file2'
>> now expands as expected, but otherwise I don't see a change. Because I
>> thought, well, maybe it's language specific, I made a new example.
>>
>> == test.org ==================================
>> #+begin_src emacs-lisp :tangle test.out :noweb tangle
>> (progn
>> <<task1>>
>> <<task2>>
>> (setq << 1 >> 2)
>> (setq <<symbol>> 1)
>> )
>> #+end_src
>> #+begin_src emacs-lisp :noweb-ref task1 :noweb tangle
>> (princ "Hallo Welt!\n")
>> #+end_src
>> ============================================
>>
>> exports to
>> == test.out ==================================
>>
>> (progn
>> (princ "Hallo Welt!\n")
>>
>> (setq << 1 >> 2)
>> (setq 1)
>> )
>> ==========================================
>>
>> still without any error message.
>>
>
> When I add emacs-lisp to the `org-babel-noweb-error-langs' variable then
> errors are raised for both <<task2>> and <<symbol>>.
>
> #+BEGIN_SRC emacs-lisp
> (add-to-list 'org-babel-noweb-error-langs "emacs-lisp")
> #+END_SRC
>
>>
>> As for the (here pretty artificial) case of "<<symbol>>", I suppose
>> avoiding that problem would require being able to suppress the special
>> meaning of the construct, which would render the source less readable,
>> so I guess one will just want to avoid this clash (e.g. inserting the
>> spaces in shell scripts before/after the filename in a "cmd << EOF >>
>> target" construct, so here your solution is certainly sufficient for
>> all but very exotic cases :-)
>>
>
> Also, see the recent emails on list in which the ability to set custom
> alternatives for << and >> we added. The example used in the email was
> the utf8 symbols « and » which should not occur in code.
>
> Best,
>
>>
>> ---- Suggestion ----
>> For cases, where a corresponding code block is not found: It would
>> probably help in debugging and prevent compilers/interpreters from
>> ignoring the missing code, if instead of an empty string, the
>> "<<foo>>" construct itself was inserted, i.e. effectively not expanded
>> at all. E.g. my sample code would result in the lisp interpreter
>> trying to get the value for an undefined variable "<<task2>>", which
>> would be a quite obvious cause of failure.
>>
>> kind regards, Yu
>>
>>
>> 2012/1/24 Eric Schulte <eric.schulte@gmx.com>:
>>> Yu <yu_icq@gmx.at> writes:
>>>
>>>> Actually, I set `org-babel-noweb-error-langs' to be the same as
>>>> `org-babel-load-languages' (forgot to mention that). Specifically it
>>>> contains
>>>> By the way, I retested it again today with the latest version from
>>>> git. Still the same result.
>>>>
>>>
>>> OK, Thanks for your persistence on this. I've just pushed up a fix for
>>> two issues.
>>>
>>> 1. noweb reference names (e.g., that which is between the <<>>s) must
>>> both start and end with non-whitespace characters
>>>
>>> 2. some of my recent changes broke the error reporting behavior
>>> associated with `org-babel-noweb-error-langs', I've fixed this
>>> behavior.
>>>
>>> Please do let me know if you continue to experience any problems.
>>>
>>> Best,
>>>
>>>>
>>>> 2012/1/23 Eric Schulte <eric.schulte@gmx.com>:
>>>>> Have you tried using the `org-babel-noweb-error-langs' variable that I
>>>>> mentioned previously? It should help in these situations.
>>>>>
>>>>> Yu <yu_icq@gmx.at> writes:
>>>>>
>>>>>> Hello again!
>>>>>>
>>>>>> I thought about the *noweb* part again. I tried the following:
>>>>>>
>>>>>> ======================================
>>>>>> #+begin_src sh :tangle test.out :noweb tangle
>>>>>> <<task1>>
>>>>>> cat << test.org >> test.out2
>>>>>> #+end_src
>>>>>> #+begin_src sh :noweb-ref task1
>>>>>> echo "hello world"
>>>>>> #+end_src
>>>>>> ======================================
>>>>>>
>>>>>> The tangled output file "test.out" looked like this:
>>>>>> ======================================
>>>>>> /bin/sh
>>>>>>
>>>>>> echo "hello world"
>>>>>> cat test.out2
>>>>>> ======================================
>>>>>>
>>>>>> i.e. the syntactically valid "<< test.org >>" construct was omitted.
>>>>>> Thus a separate syntax for forcing a literal "<<" in the tangled
>>>>>> output is needed anyway (if not yet implemented) and if so, warning
>>>>>> about undefined code blocks should be possible too.
>>>>>>
>>>>>> The big relevance of warning about undefined and never used code
>>>>>> blocks struck me, when recently I tried to use it again. The natural
>>>>>> work flow to me would have been to write something like
>>>>>>
>>>>>> : The task at hand has an overall structure
>>>>>> : #+begin_src python :tangle foo.py :noweb tangle
>>>>>> : <<read the data>>
>>>>>> : <<generate derived information>>
>>>>>> : <<output the results>>
>>>>>> : #+end_src
>>>>>>
>>>>>> When proceeding after this however I would have to keep in mind open
>>>>>> tasks or (slightly better) to instantly create TODO sections for said
>>>>>> blocks. However, having this order of working imposed on me sort of
>>>>>> defeats the purpose for my understanding. I'd rather prefer to do an
>>>>>> `M-x org-babel-tangle' tell me, that I forgot to implement one of the
>>>>>> partial tasks, rather than having to find out missing code blocks from
>>>>>> the output file (where, as mentioned, they result in "nothing" rather
>>>>>> than an unresolved "<<...>>" construct).
>>>>>>
>>>>>> kind regards, Yu
>>>>>>
>>>>>>
>>>>>>
>>>>>> 2012/1/14 Eric Schulte <eric.schulte@gmx.com>:
>>>>>>> Yu <yu_icq@gmx.at> writes:
>>>>>>>
>>>>>>>> Hello!
>>>>>>>>
>>>>>>>> I was wondering, if there is a way to get warnings for typos (e.g.
>>>>>>>> when specifying invalid properties or header arguments). It can just
>>>>>>>> easily happen that I mix up e.g. ":exports" and ":export" (though
>>>>>>>> that's probably a very harmless example).
>>>>>>>>
>>>>>>>
>>>>>>> While there is currently no way to do this there are two related
>>>>>>> functions which should help.
>>>>>>>
>>>>>>> ,----[org-babel-view-src-block-info] bound to C-c C-v I
>>>>>>> | org-babel-view-src-block-info is an interactive Lisp function in
>>>>>>> | `ob.el'.
>>>>>>> |
>>>>>>> | (org-babel-view-src-block-info)
>>>>>>> |
>>>>>>> | Display information on the current source block.
>>>>>>> | This includes header arguments, language and name, and is largely
>>>>>>> | a window into the `org-babel-get-src-block-info' function.
>>>>>>> `----
>>>>>>>
>>>>>>> and
>>>>>>>
>>>>>>> ,----[org-babel-check-src-block] bound to C-c C-v c
>>>>>>> | org-babel-check-src-block is an interactive Lisp function in `ob.el'.
>>>>>>> |
>>>>>>> | (org-babel-check-src-block)
>>>>>>> |
>>>>>>> | Check for misspelled header arguments in the current code block.
>>>>>>> `----
>>>>>>>
>>>>>>> This problem is not trivial because new language are permitted to create
>>>>>>> and use *any* header arguments they like, so there are no /wrong/ header
>>>>>>> arguments, there are only /suspicious/ header arguments (like the
>>>>>>> :exports option you suggest). The above function reports any suspicious
>>>>>>> header arguments. Perhaps there would be a way to integrate the above
>>>>>>> function with flyspell for automatic highlighting of suspicious header
>>>>>>> arguments. I'll put looking into such integration on my long-term Org
>>>>>>> task queue.
>>>>>>>
>>>>>>>>
>>>>>>>> More important it gets though, when trying to use the literate
>>>>>>>> programming facilities.
>>>>>>>>
>>>>>>>> Say I have a source code
>>>>>>>>
>>>>>>>> #+begin_src sh :noweb tangle :tangle foo.sh
>>>>>>>> <<foo>>
>>>>>>>> #+end_src
>>>>>>>> #+begin_src sh :noweb-ref fo
>>>>>>>> echo '... how are you?';
>>>>>>>> #+end_src
>>>>>>>>
>>>>>>>> then tangling would run through without any indication of the typo in
>>>>>>>> the name of the "foo" block. Such errors might be hard to debug,
>>>>>>>> because there is no indication of the error, maybe nothing other than
>>>>>>>> runtime errors.
>>>>>>>>
>>>>>>>> An error message for the /use/ of undefined references only wouldn't
>>>>>>>> avoid such problems either, e.g. consider
>>>>>>>>
>>>>>>>> #+begin_src sh :noweb tangle :tangle foo.sh
>>>>>>>> <<foo>>
>>>>>>>> #+end_src
>>>>>>>> #+begin_src sh :noweb-ref foo
>>>>>>>> echo 'Hello World...';
>>>>>>>> #+end_src
>>>>>>>> #+begin_src sh :noweb-ref fo
>>>>>>>> echo 'Hello World...';
>>>>>>>> #+end_src
>>>>>>>>
>>>>>>>> where the only detectable error is, that "fo" was never used anywhere.
>>>>>>>>
>>>>>>>> A similiar question (though without the second part) was asked here:
>>>>>>>> http://lists.gnu.org/archive/html/emacs-orgmode/2009-11/msg00273.html
>>>>>>>> As far as I can tell, it stands unanswered.
>>>>>>>>
>>>>>>>
>>>>>>> Yes, although in many languages constructs like <<foo>> are valid code,
>>>>>>> so it would be inappropriate for tangling to raise errors by default.
>>>>>>> It is possible to turn on such errors on a language-by-language basis,
>>>>>>> by customizing the following variable.
>>>>>>>
>>>>>>> ,----[org-babel-noweb-error-langs]
>>>>>>> | org-babel-noweb-error-langs is a variable defined in `ob.el'.
>>>>>>> | Its value is nil
>>>>>>> |
>>>>>>> | Documentation:
>>>>>>> | Languages for which Babel will raise literate programming errors.
>>>>>>> | List of languages for which errors should be raised when the
>>>>>>> | source code block satisfying a noweb reference in this language
>>>>>>> | can not be resolved.
>>>>>>> `----
>>>>>>>
>>>>>>>>
>>>>>>>> On a side note: What is the customary way to mention the
>>>>>>>> noweb-relevant name of a source block in the html/pdf export? After
>>>>>>>> all, if a code-block states
>>>>>>>> : <<task1>>
>>>>>>>> : <<task2>>
>>>>>>>> the reader needs to know, which code blocks define these.
>>>>>>>>
>>>>>>>
>>>>>>> Currently there is no automated support for this, so you should simply
>>>>>>> name code blocks manually, however this topic has been raised recently
>>>>>>> in another thread and there does seem to be interest for automated
>>>>>>> support.
>>>>>>>
>>>>>>> Best,
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> kind regards, Yu
>>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Eric Schulte
>>>>>>> http://cs.unm.edu/~eschulte/
>>>>>>
>>>>>
>>>>> --
>>>>> Eric Schulte
>>>>> http://cs.unm.edu/~eschulte/
>>>
>>> --
>>> Eric Schulte
>>> http://cs.unm.edu/~eschulte/
>
> --
> Eric Schulte
> http://cs.unm.edu/~eschulte/
next prev parent reply other threads:[~2012-01-30 18:00 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-12 21:38 Syntax error warnings? (Especially important with :noweb-ref's) Yu
2012-01-14 17:49 ` Eric Schulte
2012-01-21 15:21 ` Yu
2012-01-23 18:04 ` Eric Schulte
[not found] ` <CANtbJLEo-Bb3erMVRivdQYa=au81ExDJdSYRbQzXqx9F5V=VVw@mail.gmail.com>
[not found] ` <87ehuphy7a.fsf@gmx.com>
[not found] ` <CANtbJLH65=-mhZO0U0Snys=4xEDxL1mFm4JR+Gy7RDHFBTGsgw@mail.gmail.com>
[not found] ` <87sjixyx7m.fsf@gmx.com>
2012-01-30 17:59 ` Yu [this message]
2012-01-31 1:10 ` Eric Schulte
2012-01-22 21:25 ` Sebastien Vauban
2012-01-23 18:07 ` Eric Schulte
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CANtbJLH6wmd876UjEqUReSGahHUGqV9PJ68PjXTqkYz1eK+PiQ@mail.gmail.com \
--to=yu_icq@gmx.at \
--cc=emacs-orgmode@gnu.org \
--cc=eric.schulte@gmx.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).