emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
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/

  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).