(output/unspecific))))
(define (compiler:quote form environment)
- environment ;ignore
- (syntax-check '(KEYWORD DATUM) form)
+ (declare (ignore environment))
+ (syntax-check '(keyword datum) form)
(output/constant (strip-syntactic-closures (cadr form))))
+(define (compiler:quote-identifier form environment)
+ (syntax-check '(keyword identifier) form)
+ (let ((item (lookup-identifier (cadr form) environment)))
+ (if (not (variable-item? item))
+ (syntax-error "Can't quote a keyword identifier:" form))
+ (output/quoted-identifier (variable-item/name item))))
+
(define (compiler:set! form environment)
(syntax-check '(KEYWORD FORM ? EXPRESSION) form)
(receive (name environment-item)
(scode-open-block-actions expression)
mark-safe!)))
+ (define-cs-handler quoted-identifier?
+ (simple-subexpression quoted-identifier-identifier))
+
(define-cs-handler scode-access?
(simple-subexpression scode-access-environment))
(lambda (substitution expression)
(make-scode-variable (substitution (scode-variable-name expression)))))
+ (define-as-handler quoted-identifier?
+ (lambda (substitution expression)
+ (substitution (quoted-identifier-identifier expression))))
+
(define-as-handler scode-assignment?
(lambda (substitution expression)
(make-scode-assignment
--- /dev/null
+#| -*-Scheme-*-
+
+Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
+ 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016,
+ 2017 Massachusetts Institute of Technology
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+|#
+
+;;;; Test of identifier renaming
+
+(declare (usual-integrations))
+\f
+(define test-environment
+ (the-environment))
+
+(define-syntax outer
+ (sc-macro-transformer
+ (lambda (form use-env)
+ (syntax-check '(keyword identifier) form)
+ (let* ((raw (cadr form))
+ (closed (close-syntax raw use-env)))
+ `(define-syntax inner
+ (sc-macro-transformer
+ (lambda (form use-env)
+ (syntax-check '(keyword) form)
+ `(,(quote-identifier ,raw)
+ ,(quote ,raw)
+ ,(quote-identifier ,closed)
+ ,(quote ,closed)))))))))
+
+;; A fairly complicated test that shows how quote-identifier works,
+;; how it's different from quote, and that weird binding combinations
+;; work as they should.
+(define-test 'quoting
+ (lambda ()
+ (let ((expr
+ '(let ((car 13))
+ (outer car)
+ (let ((car 15))
+ (car (inner))))))
+ (assert-equal (unsyntax (syntax expr test-environment))
+ '(let ((.car.1 13))
+ (let ((.car.2 15))
+ (.car.2 (car car .car.1 car))))))))
\ No newline at end of file