F RANZ I NC. Making Environments Accessible in Common Lisp By Duane Rettig June, 2005.

30
FRANZ INC. Making Environments Accessible in Common Lisp By Duane Rettig June, 2005

Transcript of F RANZ I NC. Making Environments Accessible in Common Lisp By Duane Rettig June, 2005.

FRANZ INC.

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 Lexical Environments

(let ((x (foo))) ... (let ((x (bar))) ... ) ... )

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:

• Level 1:

• Level 2:

• Level 3:

• Level 4:

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 Levels of Support

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

FRANZ INC.

Thank You.