emacs-orgmode
[Top][All Lists]
Advanced

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

Re: [O] Functions in SBE blocks


From: Viktor Rosenfeld
Subject: Re: [O] Functions in SBE blocks
Date: Sun, 8 Jul 2012 02:55:30 +0200
User-agent: Mutt/1.5.21 (2010-09-15)

Hi Nick,

Nick Dokos wrote:

> Viktor Rosenfeld <address@hidden> wrote:
> 
> > Hi,
> > 
> > I can't get SBE blocks called from a table to work, if they use
> > functions like org-parse-time-string.
> > 
> > Suppose I have the following table:
> > 
> > | Start            | Ende             | |
> > |------------------+------------------+-|
> > | [2011-06-29 Wed] | [2012-02-29 Wed] | |
> > #+TBLFM: $3='(sbe "billable-month" (start $1) (end $2))
> > 
> > and the following source block:
> > 
> > #+NAME: billable-month(start="[2011-06-29 Wed]", end="[2012-02-29 Wed]")
> > #+BEGIN_SRC emacs-lisp
> > (let* ((start-date start))
> >    (message "%s" start-date))
> > #+END_SRC
> > 
> > If I evaluate the table, the start date is put into the last column.
> > However, if I change the code to the following:
> > 
> > #+NAME: billable-month(start="[2011-06-29 Wed]", end="[2012-02-29 Wed]")
> > #+BEGIN_SRC emacs-lisp
> > (let* ((start-date (org-parse-time-string start)))
> >    (message "%s" (nth 4 start-date)))
> > #+END_SRC
> > 
> > then the string #ERROR is inserted into the table. Evaluating the source
> > block directly yields the correct result.
> > 
> > What's going on here?
> > 
> 
> Finicky type matching: if you evaluate the second code block in the buffer 
> with
> 
>    ESC ESC : (sbe "billable-month" (start "[2011-06-29 Wed]") (end  
> "[2012-02-29 Wed]")) RET
> 
> you get a backtrace similar to this:
> 
> ,----
> | Debugger entered--Lisp error: (wrong-type-argument stringp [2011-06-29 Wed])
> |   
> string-match("\\(\\([0-9]\\{4\\}\\)-\\([0-9]\\{2\\}\\)-\\([0-9]\\{2\\}\\)\\( 
> +[^]+0-9>
> \n -]+\\)?\\( +\\([0-9]\\{1,2\\}\\):\\([0-9]\\{2\\}\\)\\)?\\)" [2011-06-29 
> Wed])
> |   (if (string-match org-ts-regexp0 s) (list 0 (if (or (match-beginning 8) 
> (not nodefault)) (string-to-number (or (match-string 8 s) "0"))) (if (or 
> (match-beginning 7) (not nodefault)) (string-to-number (or (match-string 7 s) 
> "0"))) (string-to-number (match-string 4 s)) (string-to-number (match-string 
> 3 s)) (string-to-number (match-string 2 s)) nil nil nil) (error "Not a 
> standard Org-mode time string: %s" s))
> |   org-parse-time-string([2011-06-29 Wed])
> |   (let* ((start-date (org-parse-time-string start))) (format "%d" (nth 4 
> start-date)))
> |   ...
> `----
> 
> Somewhere, the string becomes not a string. Try modifying the block to this:
> 
> #+BEGIN_SRC emacs-lisp
> (let* ((start-date (org-parse-time-string (format "%s" start))))
>    (message "%s" (nth 4 start-date)))
> #+END_SRC
> 
> Nick

Thanks, that does the trick. The double ESC evaluation is helpful, too.

Cheers,
Viktor



reply via email to

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