home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-385-Vol-1of3.iso
/
s
/
s48.zip
/
MISC
/
PACK.SCM
< prev
next >
Wrap
Text File
|
1992-06-19
|
4KB
|
158 lines
; Copyright (c) 1992 by Richard Kelsey and Jonathan Rees. See file COPYING.
; Package setup and command definitions for Scheme48 command processor
(define-package defpackage
(open system)
(export define-package package-ref scheme defpackage))
(export! system-package
'(scheme defpackage))
(define-package record
(open system)
(export make-record-type
record-constructor
record-accessor
record-modifier
record-predicate
define-record-discloser
define-record-type
))
(define-package table
(open system)
(export make-table
table?
table-ref
table-set!
table-walk))
(export! system-package
'(define-enumeration))
(define-package enumerated
(open system)
(export define-enumeration
enumerand->name
name->enumerand))
(define-package fluids
(open system)
(export make-fluid let-fluid fluid set-fluid!))
(define-package condition
(open system)
(export error warn
error? warning? interrupt?
ignore-errors raise with-handler
display-condition))
; The purpose of the packages package is to map package names to packages.
; It is referenced by commands like :set-package and :load-into.
(define-package packages
(open scheme defpackage)
(access primitives system
defpackage record table enumerated fluids condition
packages
))
(define (package-lookup-package p name)
(let ((probe (package-lookup-lightly p name)))
(if (package? probe)
probe
(error "unrecognized package name" name))))
(let ((p (package-lookup-package system-package 'packages)))
(define! p 'for-syntax package-for-syntax)
(define! p 'user user-package))
; Commands:
(define-command 'set-package "<package>" "go to package"
'(name)
(lambda (name) (set-current-package! (get-package name))))
(define-command 'new-package "<name> <package> ..." "make a new package"
'(name &rest name)
(lambda (name . opens)
(eval `(define-package ,name
(open ,@opens scheme))
(fluid $packages-environment))
(set-current-package! (get-package name))))
(define-command 'open-package "<package> ..." "use other package(s)"
'(&rest name)
(lambda names
(use-packages! (current-package) (map get-package names))))
(define-command 'load-into "<package> <filename> ..."
"load source file(s) into given package"
'(name &rest filename)
(lambda (name . filenames)
(let ((p (get-package name)))
(for-each (lambda (filename) (load filename p))
filenames))))
(define-command 'export "<name> ..."
"export from current package"
'(&rest name)
(lambda names
(export! (current-package) names)))
(define-command 'clear-package "<name>"
"delete all of a package's definitions"
'(name)
(lambda (name)
(clear-package! (get-package name))))
(define-command 'bound? "<name>"
"display binding of name, if any"
'(name)
(lambda (name)
(let ((port (fluid $output-port))
(probe (package-lookup-lightly (current-package) name)))
(if (name? probe) ;unbound
(write-line "Not bound" port)
(begin (display "Bound to " port)
(write probe)
(newline port))))))
; Auxiliaries for package commands
(define (current-package)
(fluid $package-for-commands))
(define (set-current-package! package)
(set-fluid! $package-for-commands package))
(define $packages-environment
(make-fluid (package-lookup-package system-package 'packages)))
(define (get-package name)
(package-lookup-package (fluid $packages-environment) name))
(export! system-package '(get-package))
; From Richard's misc/envs.scm:
; receive
; return
; sort-list sort-list!
; p
; vector-posq
; format
; make-tracking-input-port
; make-tracking-output-port
; make-string-input-port
; make-string-output-port
; fresh-line
; current-row
; current-column
; string-output-port-output