From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Marcin Borkowski Newsgroups: gmane.emacs.help Subject: Re: How the backquote and the comma really work? Date: Sun, 12 Jul 2015 22:33:37 +0200 Message-ID: <87k2u5azfi.fsf@mbork.pl> References: <87vbebg1fs.fsf@mbork.pl> <87r3ozy9pf.fsf@web.de> <87si9ffys0.fsf@mbork.pl> <87d20jbqbj.fsf@web.de> <87pp4jfx9y.fsf@mbork.pl> <87615sxn1a.fsf@mbork.pl> <87zj318j7z.fsf@web.de> <87mvz1b16h.fsf@mbork.pl> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Trace: ger.gmane.org 1436733251 30297 80.91.229.3 (12 Jul 2015 20:34:11 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 12 Jul 2015 20:34:11 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Sun Jul 12 22:34:03 2015 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1ZENwo-0002ev-TE for geh-help-gnu-emacs@m.gmane.org; Sun, 12 Jul 2015 22:34:03 +0200 Original-Received: from localhost ([::1]:51878 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZENwn-00068f-Nl for geh-help-gnu-emacs@m.gmane.org; Sun, 12 Jul 2015 16:34:01 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:46567) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZENwd-00068a-Ep for help-gnu-emacs@gnu.org; Sun, 12 Jul 2015 16:33:52 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZENwY-00089f-IX for help-gnu-emacs@gnu.org; Sun, 12 Jul 2015 16:33:51 -0400 Original-Received: from mail.mojserwer.eu ([2a01:5e00:2:52::8]:41155) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZENwY-00089a-5N for help-gnu-emacs@gnu.org; Sun, 12 Jul 2015 16:33:46 -0400 Original-Received: from localhost (localhost [127.0.0.1]) by mail.mojserwer.eu (Postfix) with ESMTP id 349644FA048 for ; Sun, 12 Jul 2015 22:33:45 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mail.mojserwer.eu Original-Received: from mail.mojserwer.eu ([127.0.0.1]) by localhost (mail.mojserwer.eu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id n7DTfSZ9oilI for ; Sun, 12 Jul 2015 22:33:42 +0200 (CEST) Original-Received: from localhost (unknown [109.232.24.146]) by mail.mojserwer.eu (Postfix) with ESMTPSA id 655674FA03B for ; Sun, 12 Jul 2015 22:33:41 +0200 (CEST) In-reply-to: <87mvz1b16h.fsf@mbork.pl> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a01:5e00:2:52::8 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:105663 Archived-At: On 2015-07-12, at 21:55, Marcin Borkowski wrote: > On 2015-07-12, at 17:54, Michael Heerdegen w= rote: > >> There is a problem though when the read expression is nested. I tried >> to `mci/read' this string for example: >> >> "(defun fac (x) (if (< 2 x) 1 (* x (fac (1- x)))))" >> >> and got >> >> (defun fac :open-paren x) >> >> as result. If you Edebug your functions, you can see what goes wrong. >> Please tell me if you need more hints... > > Good catch, thanks. No need for edebug, I guess =E2=80=93 I haven=E2=80= =99t looked at > my code, but I guess I know the problem already. Stupid me. So, what about this? It seems to work. OTOH, I think it's not the most elegant thing possible, since there is some code duplication: mci/read has this: (:open-paren (mci/read-list-contents)) in a (a)case statement, and mci/read-list-contents has this: (:open-paren (setq next (mci/read-list-contents))). Something tells my mathematical mind that there probably exists a cleaner approach. --8<---------------cut here---------------start------------->8--- (require 'anaphora) ; we'll need acase ;; Reader (defun mci/next-token () "Get the next token from the current buffer at point position. A token can be: an integer, a symbol, a parenthesis, a comma, a backquote or a quote. Return a number (in case of an integer), a symbol (in case of a symbol), or one of the symbols: :open-paren, :close-paren, :quote, :quasi-quote, :unquote, :eob. (Of course, if someone is devious enough to include one of these symbols in the expression being read, he'll get what he deserves: a chaos.)" (skip-chars-forward " \t\n") (cond ((eq (char-after) ?\() (forward-char) :open-paren) ((eq (char-after) ?\)) (forward-char) :close-paren) ((eq (char-after) ?\') (forward-char) :quote) ((eq (char-after) ?\`) (forward-char) :quasi-quote) ((eq (char-after) ?\,) (forward-char) :unquote) ((looking-at "\\([-+]?[[:digit:]]+\\)[ \t\n)]") (skip-chars-forward "[:digit:]") (string-to-number (match-string 1))) ((looking-at "[^ \t\n)]+") (goto-char (match-end 0)) (intern (match-string-no-properties 0))) ((eobp) :eob))) (defun mci/read () "Read one Elisp expression from the buffer at point." (acase (mci/next-token) (:open-paren (mci/read-list-contents)) (:close-paren (error "Unexpected closing paren at line %d encountered -- mci/read" (line-number-at-pos))) (:quote (list 'quote (mci/read))) (:quasi-quote (list 'quasi-quote (mci/read))) (:unquote (list 'unquote (mci/read))) (:eob nil) (t it))) (defun mci/read-list-contents () "Read list contents (until the closing paren), gobble the closing paren." (let ((next (mci/next-token)) list) (while (not (eq next :close-paren)) (case next (:open-paren (setq next (mci/read-list-contents))) (:eob (error "Unexpected EOB while reading a list -- mci/read-list-conte= nts")) (t (push next list) (setq next (mci/next-token))))) (nreverse list))) --8<---------------cut here---------------end--------------->8--- Best, --=20 Marcin Borkowski http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski Faculty of Mathematics and Computer Science Adam Mickiewicz University