+ All Categories
Home > Documents > F RANZ I NC. Making Environments Accessible in Common Lisp By Duane Rettig June, 2005.

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

Date post: 18-Dec-2015
Category:
Upload: ella-watson
View: 216 times
Download: 0 times
Share this document with a friend
Popular Tags:
30
FRANZ INC. Making Environments Accessible in Common Lisp By Duane Rettig June, 2005
Transcript

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.


Recommended