76 lines
3.0 KiB
Scheme
76 lines
3.0 KiB
Scheme
;;; Copyright (c) 2006, 2007 Abdulaziz Ghuloum and Kent Dybvig
|
|
;;;
|
|
;;; Permission is hereby granted, free of charge, to any person obtaining a
|
|
;;; copy of this software and associated documentation files (the "Software"),
|
|
;;; to deal in the Software without restriction, including without limitation
|
|
;;; the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
;;; and/or sell copies of the Software, and to permit persons to whom the
|
|
;;; Software is furnished to do so, subject to the following conditions:
|
|
;;;
|
|
;;; The above copyright notice and this permission notice shall be included in
|
|
;;; all copies or substantial portions of the Software.
|
|
;;;
|
|
;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
;;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
;;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
;;; THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
;;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
;;; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
;;; DEALINGS IN THE SOFTWARE.
|
|
|
|
(library (psyntax config)
|
|
(export if-wants-define-record if-wants-define-struct
|
|
if-wants-case-lambda
|
|
if-wants-letrec* if-wants-global-defines
|
|
if-wants-library-letrec*
|
|
base-of-interaction-library)
|
|
(import (rnrs))
|
|
|
|
(define (base-of-interaction-library) '(ikarus))
|
|
|
|
(define-syntax define-option
|
|
(syntax-rules ()
|
|
((_ name #t)
|
|
(define-syntax name
|
|
(syntax-rules ()
|
|
((_ sk fk) sk))))
|
|
((_ name #f)
|
|
(define-syntax name
|
|
(syntax-rules ()
|
|
((_ sk fk) fk))))))
|
|
|
|
|
|
(define-option if-wants-define-record #t)
|
|
(define-option if-wants-define-struct #t)
|
|
;;; define-record is an ikarus-specific extension.
|
|
;;; should be disabled for all other implementations
|
|
;;; the source is included to illustrate how
|
|
;;; implementation-specific extensions can be added
|
|
;;; to the expander
|
|
|
|
(define-option if-wants-global-defines #f)
|
|
;;; If the implementation requires that all global
|
|
;;; variables be defined before they're set!ed,
|
|
;;; then enabling this option causes the expander
|
|
;;; to produce (define <global> '#f) for every
|
|
;;; exported identifiers. If the option is disabled,
|
|
;;; then the global definitions are suppressed.
|
|
|
|
(define-option if-wants-case-lambda #t)
|
|
;;; Implementations that support case-lambda natively
|
|
;;; should have the next option enabled. Disabling
|
|
;;; wants-case-lambda causes the expander to produce
|
|
;;; ugly, inefficient, but correct code by expanding
|
|
;;; case-lambda into explicit dispatch code.
|
|
|
|
(define-option if-wants-letrec* #t)
|
|
;;; If the implementation has built-in support for
|
|
;;; efficient letrec* (ikarus, chez), then this option
|
|
;;; should be enabled. Disabling the option expands
|
|
;;; (letrec* ((lhs* rhs*) ...) body) into
|
|
;;; (let ((lhs* #f) ...) (set! lhs* rhs*) ... body)
|
|
|
|
(define-option if-wants-library-letrec* #t)
|
|
|
|
)
|