emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] Syntax error warnings? (Especially important with :noweb-ref's)


From: Yu
Subject: Re: [O] Syntax error warnings? (Especially important with :noweb-ref's)
Date: Mon, 30 Jan 2012 18:59:31 +0100

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 <address@hidden>:
> Yu <address@hidden> 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 <address@hidden>:
>>> Yu <address@hidden> 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 <address@hidden>:
>>>>> Have you tried using the `org-babel-noweb-error-langs' variable that I
>>>>> mentioned previously?  It should help in these situations.
>>>>>
>>>>> Yu <address@hidden> 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 <address@hidden>:
>>>>>>> Yu <address@hidden> 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/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]