From: Andreas Rottmann <a.rottmann@gmx.at>
To: Andy Wingo <wingo@pobox.com>
Cc: Guile Developers <guile-devel@gnu.org>
Subject: Re: Quasisyntax broken?
Date: Fri, 24 Jul 2009 00:35:02 +0200 [thread overview]
Message-ID: <87skgn81ux.fsf@delenn.lan> (raw)
In-Reply-To: <m31vo7gk89.fsf@pobox.com> (Andy Wingo's message of "Thu, 23 Jul 2009 23:31:02 +0200")
[-- Attachment #1: Type: text/plain, Size: 492 bytes --]
Andy Wingo <wingo@pobox.com> writes:
> On Fri 03 Jul 2009 02:04, Andreas Rottmann <a.rottmann@gmx.at> writes:
>
>> Playing around with Guile's now-in-core syntax-case support (using Git
>> HEAD as of today), I found that quasisyntax seems quite broken:
>
> We've spoken over IRC since then, but for those that do not frequent
> there, it's simply not implemented. You can implement it in terms of
> with-syntax, though. Did you have a patch for that, Andreas?
>
Yep, the patch is attached:
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Quasisyntax --]
[-- Type: text/x-diff, Size: 3603 bytes --]
From: Andreas Rottmann <a.rottmann@gmx.at>
Subject: [PATCH] Add support for `quasisyntax'
---
module/ice-9/boot-9.scm | 75 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 75 insertions(+), 0 deletions(-)
diff --git a/module/ice-9/boot-9.scm b/module/ice-9/boot-9.scm
index 36a463a..26d73a7 100644
--- a/module/ice-9/boot-9.scm
+++ b/module/ice-9/boot-9.scm
@@ -308,6 +308,81 @@
(syntax-rules ()
((_ exp) (make-promise (lambda () exp)))))
+;; Add quasisyntax support. This is a slight variation of the code
+;; posted in http://srfi.schemers.org/srfi-93/mail-archive/msg00063.html
+(define-syntax quasisyntax
+ (lambda (e)
+
+ (define (expand-quasisyntax x)
+
+ ;; Expand returns a syntax object of the form
+ ;; (template[t/e, ...] (replacement ...))
+ ;; Here template[t/e ...] denotes the original template
+ ;; with unquoted expressions e replaced by fresh
+ ;; variables t, followed by the appropriate ellipses
+ ;; if e is also spliced.
+ ;; The second part of the return value is the list of
+ ;; replacements, each of the form (t e) if e is just
+ ;; unquoted, or ((t ...) e) if e is also spliced.
+ ;; This will be the list of bindings of the resulting
+ ;; with-syntax expression.
+
+ (define (expand x level)
+ (syntax-case x (quasisyntax unsyntax unsyntax-splicing)
+ ((quasisyntax e)
+ (with-syntax (((k _) x) ; Original must be copied
+ ((rest bs) (expand (syntax e) (+ level 1))))
+ (syntax
+ ((k rest) bs))))
+ ((unsyntax e)
+ (= level 0)
+ (with-syntax (((t) (generate-temporaries '(t))))
+ (syntax (t ((t e))))))
+ (((unsyntax e ...) . r)
+ (= level 0)
+ (with-syntax (((rest (b ...)) (expand (syntax r) 0))
+ ((t ...) (generate-temporaries (syntax (e ...)))))
+
+ (syntax
+ ((t ... . rest)
+ ((t e) ... b ...)))))
+ (((unsyntax-splicing e ...) . r)
+ (= level 0)
+ (with-syntax (((rest (b ...)) (expand (syntax r) 0))
+ ((t ...) (generate-temporaries (syntax (e ...)))))
+ (with-syntax ((((t ...) ...) (syntax ((t (... ...)) ...))))
+ (syntax
+ ((t ... ... . rest)
+ (((t ...) e) ... b ...))))))
+ ((k . r)
+ (and (> level 0)
+ (identifier? (syntax k))
+ (or (free-identifier=? (syntax k) (syntax unsyntax))
+ (free-identifier=? (syntax k) (syntax unsyntax-splicing))))
+ (with-syntax (((rest bs) (expand (syntax r) (- level 1))))
+ (syntax
+ ((k . rest) bs))))
+ ((h . t)
+ (with-syntax (((head (b1 ...)) (expand (syntax h) level))
+ ((tail (b2 ...)) (expand (syntax t) level)))
+ (syntax
+ ((head . tail)
+ (b1 ... b2 ...)))))
+ (#(e ...)
+ (with-syntax ((((e* ...) bs)
+ (expand (vector->list (syntax #(e ...))) level)))
+ (syntax
+ (#(e* ...) bs))))
+ (other
+ (syntax (other ())))))
+
+ (with-syntax (((template bindings) (expand x 0)))
+ (syntax
+ (with-syntax bindings (syntax template)))))
+
+ (syntax-case e ()
+ ((k template)
+ (expand-quasisyntax (syntax template))))))
\f
;;; {Defmacros}
--
tg: (3b0b6bc..) t/quasisyntax (depends on: master)
[-- Attachment #3: Type: text/plain, Size: 113 bytes --]
From my few experiments, it seems to work nicely.
Cheers, Rotty
--
Andreas Rottmann -- <http://rotty.yi.org/>
next prev parent reply other threads:[~2009-07-23 22:35 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-07-03 0:04 Quasisyntax broken? Andreas Rottmann
2009-07-23 21:31 ` Andy Wingo
2009-07-23 22:35 ` Andreas Rottmann [this message]
2009-07-23 22:48 ` Andy Wingo
2009-07-25 21:30 ` Andreas Rottmann
2009-07-26 13:15 ` Ludovic Courtès
2009-07-26 16:30 ` Andy Wingo
2009-07-26 22:06 ` Ludovic Courtès
2009-07-27 22:51 ` Neil Jerram
2009-08-20 21:19 ` Ludovic Courtès
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.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87skgn81ux.fsf@delenn.lan \
--to=a.rottmann@gmx.at \
--cc=guile-devel@gnu.org \
--cc=wingo@pobox.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.
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).