F RANZ I NC. Making Environments Accessible in Common Lisp By Duane Rettig June, 2005.
-
Upload
ella-watson -
Category
Documents
-
view
216 -
download
0
Transcript of F RANZ I NC. Making Environments Accessible in Common Lisp By Duane Rettig June, 2005.
FRANZ INC.
What is An Environment?
• A set of bindings of names to values
• A context within which to work
• Parameterizations of behaviors
FRANZ INC.
Need for Lexical Environments
(defun foo (x y z) (flet ((bar (x)
(1+ x)) (bas (y) (+ x y)))
(+ x (bar y) (baz z))))
FRANZ INC.
Need for Dynamic Environments
;; In lisp:(defmacro foo (x) `(car ,x))
;; In a file:(defmacro foo (y) `(1+ ,y))
(defun bar (x) (isqrt (foo x)))
FRANZ INC.
Typical Implementation of Environments
(let ((x 10)) ... (symbol-macrolet ((x 'foo)) ... (let ((x 20)) ... ;; here: )))
%venv% <= (... (x . 20) ... (x #.*sm-marker* . foo) ... (x . 10) ...)
FRANZ INC.
Problems with list-style Environments
• Environment has no identity– Multiple lists are necessary– Objects not distinguishable as environments
• Accesses can be long for deep contour nesting
• Persistence and contour structure not automatic
FRANZ INC.
Desired Representation of Lexical Environment Elements
Hash:
x
Contours:
(lexical 20)
(lexical 10)
(symbol-macro foo)
Old:
New:
x x x
Search direction
Searchdirection
FRANZ INC.
Environments Access Design Goals (part 1)
• Compatible with Common Lisp Spec where possible
• Open Source
• Start with CLtL2 definition, moving away only when necessary
• Move the Language forward– Allow the compiler to be more transparent– Allow portability of optimizations
FRANZ INC.
Environments Access Design Goals (part 2)
• Fast (building, access)
• Portable (on several levels)
• Controllable Persistence• describes the contour forms
• easy to conceptualize the program structure
• allow multiple entry and annotation for multiple compiler passes and for debuggers
• Consistent for compilation and interpretation
FRANZ INC.
Major Departures from Environments in CLtL2
• Entries are bindings, not just names• Environments have “kinds”• Dynamic environment component is added• Augment-environment can reuse object• Declarations are done differently
– Define-declaration has different syntax– Declarations sometimes added after variable
bindings
FRANZ INC.
Pictorial View of Environment Objects
lexical namespaces
base
Dynamicnamespaces
e1
e5
e7
e4
e3
e2
e6
e8
nil
1
2
1 1
1 1 1
3
2 1
1 3
FRANZ INC.
Environment Kinds
• Interpreter (for lisps with interpreter)
• Compilation (compilation-walking in 7.0)
• Evaluation
• Compiler (compilation in 7.0)
• Macros-only
FRANZ INC.
Variables Associated with Environments
• *interpreter-environment*
• *compilation-unit-environment*• [*compile-file-environment* in Allegro CL 7.0]
• *evaluation-environment*
FRANZ INC.
*interpreter-environment* Usage
• Only available when an interpreter exists
• Hard to capture - REPL continuously binds
FRANZ INC.
*compilation-unit-environment* Usage
• Created when new compile-file or with-compilation-unit established
• Can be built with either– sys:make-compilation-unit-environment or– sys:make-compile-file-environment (deprecated)
FRANZ INC.
*evaluation-environment* Usage
• Read-only feel - definitions taken from environment but stored globally
FRANZ INC.
Extensions Beyond the Spec
• Compiler environments
• Extra arg to macroexpand/macroexpand-1 for special operators
• Environments extend to compilation-unit
FRANZ INC.
To Do:
• “Split” define-declaration to allow redefinitions and development
• Add expression-information and :expression argument to augment-environment
• Encourage CL vendors to make use of this module
• Accept suggestions
FRANZ INC.
Levels of Portability/Porting
• Level 0:– Implementation has its own proprietary
(open or not) representation
• Level 1:
• Level 2:
• Level 3:
• Level 4:
FRANZ INC.
Levels of Portability/Porting
• Level 0: Proprietary
• Level 1:– Compilation and operation of the basic
functionality
• Level 2:
• Level 3:
• Level 4:
FRANZ INC.
Levels of Portability/Porting
• Level 0: Proprietary
• Level 1: Basic
• Level 2:– Current environment emulated at the
Environments Access interface level
• Level 3:
• Level 4:
FRANZ INC.
Levels of Portability/Porting
• Level 0: Proprietary
• Level 1: Basic
• Level 2: Emulation
• Level 3:– Environments Access holds the information,
Proprietary interface queries it
• Level 4:
FRANZ INC.
Levels of Portability/Porting
• Level 0: Proprietary
• Level 1: Basic
• Level 2: Emulation
• Level 3: Transitional
• Level 4:– Environments Access fully integrated into
compiler, optionally interpreter• proprietary representation unused or deprecated
FRANZ INC.
Levels of Portability/Porting
• Level 0: Proprietary
• Level 1: Basic
• Level 2: Emulation
• Level 3: Transitional
• Level 4: Full
FRANZ INC.
Current Links
• http://franz.com/support/documentation/7.0/doc/environments.htm
• (http://www.lispwire.com/entry-proganal-envaccess-des)
FRANZ INC.
Look at the Implementation (switch to Linux)
• Bring up lisps and demonstrate Environment building/access
• Look at source code for major functions