[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Quasisyntax broken?
From: |
Andreas Rottmann |
Subject: |
Re: Quasisyntax broken? |
Date: |
Sat, 25 Jul 2009 23:30:04 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.0.96 (gnu/linux) |
Andy Wingo <address@hidden> writes:
> Hi,
>
> On Fri 24 Jul 2009 00:35, Andreas Rottmann <address@hidden> writes:
>
>> Andy Wingo <address@hidden> writes:
>>
>>> On Fri 03 Jul 2009 02:04, Andreas Rottmann <address@hidden> 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:
>
> What is the license of this code?
>
It's under the (unmodified) MIT license, see
<http://srfi.schemers.org/srfi-process.html>. I've attached an updated
patch, which takes the quasisyntax implementation straight from Andre
van Tonder's portable R6RS libraries implementation[0], without any
modification.
[0] http://www.het.brown.edu/people/andre/macros/index.html
> (Do you have copyright assignment on file? I assume the original
> author does not.)
>
I think I filed one for Guile several years ago, and think you assume
rightly; I guess that might be a problem; OTOH it would be (IMHO) kinda
dumb to have to ignore/rewrite all the perfectly (L)GPL-compatible BSD-
and MIT-licensed code that's out there, as you cannot expect the
respective authors to all sign copyright assignments for Guile...
From: Andreas Rottmann <address@hidden>
Subject: [PATCH] Add support for `quasisyntax'
---
module/ice-9/boot-9.scm | 117 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 117 insertions(+), 0 deletions(-)
diff --git a/module/ice-9/boot-9.scm b/module/ice-9/boot-9.scm
index 36a463a..31ebfe0 100644
--- a/module/ice-9/boot-9.scm
+++ b/module/ice-9/boot-9.scm
@@ -308,6 +308,123 @@
(syntax-rules ()
((_ exp) (make-promise (lambda () exp)))))
+;; Quasisyntax in terms of syntax-case.
+;;
+;; Code taken from
+;; <http://www.het.brown.edu/people/andre/macros/index.html>;
+;; Copyright (c) 2006 Andre van Tonder
+;; Copyright statement at http://srfi.schemers.org/srfi-process.html
+;;
+;;=========================================================
+;;
+;; To make nested unquote-splicing behave in a useful way,
+;; the R5RS-compatible extension of quasiquote in appendix B
+;; of the following paper is here ported to quasisyntax:
+;;
+;; Alan Bawden - Quasiquotation in Lisp
+;; http://citeseer.ist.psu.edu/bawden99quasiquotation.html
+;;
+;; The algorithm converts a quasisyntax expression to an
+;; equivalent with-syntax expression.
+;; For example:
+;;
+;; (quasisyntax (set! #,a #,b))
+;; ==> (with-syntax ((t0 a)
+;; (t1 b))
+;; (syntax (set! t0 t1)))
+;;
+;; (quasisyntax (list #,@args))
+;; ==> (with-syntax (((t ...) args))
+;; (syntax (list t ...)))
+;;
+;; Note that quasisyntax is expanded first, before any
+;; ellipses act. For example:
+;;
+;; (quasisyntax (f ((b #,a) ...))
+;; ==> (with-syntax ((t a))
+;; (syntax (f ((b t) ...))))
+;;
+;; so that
+;;
+;; (let-syntax ((test-ellipses-over-unsyntax
+;; (lambda (e)
+;; (let ((a (syntax a)))
+;; (with-syntax (((b ...) (syntax (1 2 3))))
+;; (quasisyntax
+;; (quote ((b #,a) ...))))))))
+;; (test-ellipses-over-unsyntax))
+;;
+;; ==> ((1 a) (2 a) (3 a))
+(define-syntax quasisyntax
+ (lambda (e)
+
+ ;; Expand returns a list 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 identifier must be copied
+ ((e* reps) (expand (syntax e) (+ level 1))))
+ (syntax ((k e*) reps))))
+ ((unsyntax e)
+ (= level 0)
+ (with-syntax (((t) (generate-temporaries '(t))))
+ (syntax (t ((t e))))))
+ (((unsyntax e ...) . r)
+ (= level 0)
+ (with-syntax (((r* (rep ...)) (expand (syntax r) 0))
+ ((t ...) (generate-temporaries (syntax (e
...)))))
+ (syntax ((t ... . r*)
+ ((t e) ... rep ...)))))
+ (((unsyntax-splicing e ...) . r)
+ (= level 0)
+ (with-syntax (((r* (rep ...)) (expand (syntax r) 0))
+ ((t ...) (generate-temporaries (syntax (e
...)))))
+ (with-syntax ((((t ...) ...) (syntax ((t (... ...)) ...))))
+ (syntax ((t ... ... . r*)
+ (((t ...) e) ... rep ...))))))
+ ((k . r)
+ (and (> level 0)
+ (identifier? (syntax k))
+ (or (free-identifier=? (syntax k) (syntax unsyntax))
+ (free-identifier=? (syntax k) (syntax unsyntax-splicing))))
+ (with-syntax (((r* reps) (expand (syntax r) (- level 1))))
+ (syntax ((k . r*) reps))))
+ ((h . t)
+ (with-syntax (((h* (rep1 ...)) (expand (syntax h) level))
+ ((t* (rep2 ...)) (expand (syntax t) level)))
+ (syntax ((h* . t*)
+ (rep1 ... rep2 ...)))))
+ (#(e ...)
+ (with-syntax ((((e* ...) reps)
+ (expand (vector->list (syntax #(e ...))) level)))
+ (syntax (#(e* ...) reps))))
+ (other
+ (syntax (other ())))))
+
+ (syntax-case e ()
+ ((_ template)
+ (with-syntax (((template* replacements) (expand (syntax template) 0)))
+ (syntax
+ (with-syntax replacements (syntax template*))))))))
+
+(define-syntax unsyntax
+ (lambda (e)
+ (syntax-violation 'unsyntax "Invalid expression" e)))
+
+(define-syntax unsyntax-splicing
+ (lambda (e)
+ (syntax-violation 'unsyntax "Invalid expression" e)))
;;; {Defmacros}
--
tg: (74deff3..) t/quasisyntax (depends on: master)
Rotty
--
Andreas Rottmann -- <http://rotty.yi.org/>
- Quasisyntax broken?, Andreas Rottmann, 2009/07/02
- Re: Quasisyntax broken?, Andy Wingo, 2009/07/23
- Re: Quasisyntax broken?, Andreas Rottmann, 2009/07/23
- Re: Quasisyntax broken?, Andy Wingo, 2009/07/23
- Re: Quasisyntax broken?,
Andreas Rottmann <=
- Re: Quasisyntax broken?, Ludovic Courtès, 2009/07/26
- Re: Quasisyntax broken?, Andy Wingo, 2009/07/26
- Re: Quasisyntax broken?, Ludovic Courtès, 2009/07/26
- Re: Quasisyntax broken?, Neil Jerram, 2009/07/27