<<

Homoiconic Lisp Yosuke Fukuda Graduate School of Informatics, Kyoto University

The goal of this work and the current status The notion of “

•Ultimate goal To give a reasonably minimal condition of “program se- According to [Kay 1969], a language is mantics” to define various program semantics called homoiconic if its internal and external rep- •Current status A Lisp implementation that can define a lot of program- resentations are essentially the same. ming language features for it, in the language itself

Homoiconic Lisp (HLisp) Feature GitHub Repository •HLisp is a small fragment of Scheme with a first class mechanism The implementation of Homoiconic Lisp is available at •It can write a lot of constructs (e.g. if-expression, recursive function https://github.com/yf-fyf/hlisp definition, and quasi-quotation) as user-defined programs •It is based on a simple extension of SECD machine [Landin 1964] with a few primitives

Macro closure, a way to achieve homoiconicity The notion of macro closure is a function closure to manipulate program, designed analogously to the closure of λ-abstraction Intuition of its computation

((macro (x1 ··· xn) M) N1 ··· Nn) ( M[x1 := (quote N1), ··· , xn := (quote Nn)]) Example The first program shows a usage of macro closure (macro abstraction), that corresponds to the secondone 1 ((macro (x y) x) (print 123) (print 456)) 1 (eval ((lambda (x y) x) '(print 123) '(print 456))) 2 ; => 123 (as a side-effect) 2 ; => 123 (as a side-effect)

An extended SECD machine with macro closure, ESECD Syntactic category Constant ::= f | f | quote | eval Stack S ::= nil | U :: S Term M,N ::= c | x | λx.M | λx.M | @MN | dMe Environment E ::= nil | hx, Ui :: E SECD Value U ::= c | h(λx.M), Ei | h(λx.M), Ei | dMe Control string C ::= ret | back | call :: C | M :: C Dump D ::= halt | hS, E, C, Di | hM, C, Di Transition rules (with some omissions) Example (λx.1) (print 0) ⇓ 1 (without any printing effect) hS, E, c :: C, Di hc :: S, E, C, Di hS, E, (@(λx.1) (print 0)) :: ret, halti hS, E, x :: C, Di hU :: S, E, C, Di if U = Lookupx(E) hS, E, (λx.1) :: back, h(print 0), ret, haltii hS, E, (λx.M) :: C, Di hh(λx.M), Ei :: S, E, C, Di hh(λx.1), Ei :: S, E, back, h(print 0), ret, haltii hS, E, (λx.M) :: C, Di hh(λx.M), Ei :: S, E, C, Di hdprint 0e :: h(λx.1), Ei :: S, E, call :: ret, halti hS, E, (@MN) :: C, Di hS, E, M :: back, hN, C, Dii hnil, hx, dprint 0ei :: E, 1 :: ret, heval :: S, E, call :: ret, haltii 0 0 0 0 hhλx.M , E i :: S, E, back, hN, C, Dii hhλx.M , E i :: S, E, N :: call :: C, Di h1 :: nil, hx, dprint 0ei :: E, ret, heval :: S, E, call :: ret, haltii 0 0 0 0 hhλx.M , E i :: S, E, back, hN, C, Dii hdNe :: hλx.M , E i :: S, E, call :: C, Di h1 :: eval :: S, E, call :: ret, halti 0 0 0 0 hU :: h(λx.M ), E i :: S, E, call :: C, Di hnil, hx, Ui :: E , M :: ret, hS, E, C, Dii h1 :: S, E, ret, halti 0 0 0 0 0 hdNe :: h(λx.M ), E i :: S, E, call :: C, Di hnil, hx, dNei :: E , M :: ret, D i hU :: quote :: S, E, call :: C, Di hU :: S, E, C, Di hdMe :: eval :: S, E, call :: C, Di hS, E, M :: C, Di hU :: eval :: S, E, call :: C, Di hU :: S, E, C, Di if U is not a code 0 0 0 0 0 0 0 0 hU :: S, E, ret, hS , E , C , D ii hU :: S , E , C , D i

Property of ESCD Future work The “correctness” of ESCD is shown through a λ-calc. as in [Plotkin 1975] •Fill the gap between ESECD and HLisp, since the Thm If M is a closed term, then TFAE: former has no primitive that produces side-effect •M ⇓ V in λH (Note: λH is an extension of λ-calc. with macro closure) •Extend the theory and implementation to cover •hnil, nil, M :: ret, halti ⇓ U in ESECD other evaluation strategies (Adding a hook oper- where V and U denote the “same” value (formally, defined as in [Plotkin 1975]) ation to variable lookup may achieve this)

LATEX TikZposter