emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Martyn Jago <martyn.jago@btinternet.com>
To: emacs-orgmode@gnu.org
Subject: Re: [babel][bug] org-babel-balanced-split (with Emacs-22)
Date: Tue, 03 Jan 2012 18:32:56 +0000	[thread overview]
Message-ID: <m21urgtz53.fsf@btinternet.com> (raw)
In-Reply-To: 87hb0cu1bb.fsf@gmx.com

Eric Schulte <eric.schulte@gmx.com> writes:

> Martyn Jago <martyn.jago@btinternet.com> writes:
>
>> Martyn Jago <martyn.jago@btinternet.com> writes:
>>
>> [...]
>>
>> The problem appears to be associated with the way `member' works:
>>
>>  - on Emacs 23+ the following doesn't generate an error 
>>  - on Emacs 22 it generates "Wrong type argument: listp, 58"
>>
>> #+begin_src emacs-lisp
>>
>> (member 116 58) 
>>
>> #+end_src
>>
>> `org-babel-balanced-split' appears to rely on not generating an error
>> when the `member' LIST parameter is actually a number.
>>
>
> Ah, I see where this comes in, does the included alternative definition
> of this function fix the issue on Emacs22?  If so I'll apply this change
> to the repository.
>
> Thanks,
>
> (defun org-babel-balanced-split (string alts)
>   "Split STRING on instances of ALTS.
> ALTS is a cons of two character options where each option may be
> either the numeric code of a single character or a list of
> character alternatives.  For example to split on balanced
> instances of \"[ \t]:\" set ALTS to '((32 9) . 58)."
>   (flet ((matches (ch spec) (or (and (numberp spec) (= spec ch))
> 				(not (numberp spec) (member ch spec))))

[...]

Hi Eric

I fixed a typo on your fix, and added a regression test, and it now
works on Emacs 22. Thanks!

Best, Martyn

--8<---------------cut here---------------start------------->8---
(defun org-babel-balanced-split (string alts)
  "Split STRING on instances of ALTS.
ALTS is a cons of two character options where each option may be
either the numeric code of a single character or a list of
character alternatives.  For example to split on balanced
instances of \"[ \t]:\" set ALTS to '((32 9) . 58)."
  (flet ((matches (ch spec) (or (and (numberp spec) (= spec ch))
				(and (not (numberp spec))
				     (member ch spec))))
	 (matched (ch last)
		  (if (consp alts)
		      (and (matches ch (cdr alts))
			   (matches last (car alts)))
		    (matches ch alts))))
    (let ((balance 0) (quote nil) (partial nil) (lst nil) (last 0))
      (mapc (lambda (ch)  ; split on [], (), "" balanced instances of [ \t]:
	      (setq balance (+ balance
			       (cond ((or (equal 91 ch) (equal 40 ch)) 1)
				     ((or (equal 93 ch) (equal 41 ch)) -1)
				     (t 0))))
	      (when (and (equal 34 ch) (not (equal 92 last)))
		(setq quote (not quote)))
	      (setq partial (cons ch partial))
	      (when (and (= balance 0) (not quote) (matched ch last))
		(setq lst (cons (apply #'string (nreverse
						 (if (consp alts)
						     (cddr partial)
						   (cdr partial))))
				lst))
		(setq partial nil))
	      (setq last ch))
	    (string-to-list string))
      (nreverse (cons (apply #'string (nreverse partial)) lst)))))
--8<---------------cut here---------------end--------------->8---


--8<---------------cut here---------------start------------->8---
(ert-deftest test-ob/org-babel-balanced-split ()
  (should (equal
	   '(":a 1" "b [2 3]" "c (4 :d (5 6))")
	   (org-babel-balanced-split ":a 1 :b [2 3] :c (4 :d (5 6))" '((32 9) . 58)))))
--8<---------------cut here---------------end--------------->8---

  reply	other threads:[~2012-01-03 18:33 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-02 17:41 [babel][bug] Martyn Jago
2012-01-03 17:40 ` [babel][bug] org-babel-balanced-split (with Emacs-22) Martyn Jago
2012-01-03 17:46   ` Eric Schulte
2012-01-03 18:32     ` Martyn Jago [this message]
2012-01-03 18:46       ` Eric Schulte
2012-01-03 18:49         ` Achim Gratz
2012-01-03 19:10           ` Eric Schulte
2012-01-03 19:22             ` Achim Gratz
2012-01-03 20:57               ` 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=m21urgtz53.fsf@btinternet.com \
    --to=martyn.jago@btinternet.com \
    --cc=emacs-orgmode@gnu.org \
    /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).