Theo D’Hondt SLIP: a simple language implementation platform Abstract SLIP is a minimalist platform for the instruction and exploration of language implementations. It is a distillation of two previous platforms - Pico and ˈ sk ē m - but is not intended as a language in its own right. SLIP is of course a language: a very minimal but complete version of LISP - with a distinct Scheme flavour. But SLIP is also a sequence of interpreters, starting with a 100 line fully metacircular version. In the spirit of Friedman's EOPL, this version is rewritten in continuation passing style and translated into C in a straightforward way. Twelve successive versions introduce features such as trampolines, lexical addressing and garbage collection, to end with a fully optimized version that executes a simple benchmark on par with the PLT Scheme interpreter. SLIP is a chain of implementations presented as an instruction tool. It is also an experimentation tool, and this presentation will present a 13th version that introduces simple futures into SLIP in view of experimenting with multi-core systems. SLIP has been used in the Francqui chair (soft.vub.ac.be/francqui) earlier this year, and already twice in the Programming Language Engineering (PLE) course. It will again be used - including version 13 - in this year's issue of PLE. 10 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 10
Theo D’Hondt SLIP: a simple language implementation platform Abstract SLIP is a minimalist platform for the instruction and exploration of language implementations. It is a distillation of two previous platforms - Pico and ˈ sk ē m - but is not intended as a language in its own right. SLIP is of course a language: a very minimal but complete version of LISP - with a distinct Scheme flavour. But SLIP is also a sequence of interpreters, starting with a 100 line fully metacircular version. In the spirit of Friedman's EOPL, this version is rewritten in continuation passing style and translated into C in a straightforward way. Twelve successive versions introduce features such as trampolines, lexical addressing and garbage collection, to end with a fully optimized version that executes a simple benchmark on par with the PLT Scheme interpreter. SLIP is a chain of implementations presented as an instruction tool. It is also an experimentation tool, and this presentation will present a 13th version that introduces simple futures into SLIP in view of experimenting with multi-core systems. SLIP has been used in the Francqui chair (soft.vub.ac.be/francqui) earlier this year, and already twice in the Programming Language Engineering (PLE) course. It will again be used - including version 13 - in this year's issue of PLE. 11 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 11
Theo D’Hondt SLIP: a simple language implementation platform Abstract SLIP is a minimalist platform for the instruction and exploration of language implementations. It is a distillation of two previous platforms - Pico and ˈ sk ē m - but is not intended as a language in its own right. SLIP is of course a language: a very minimal but complete version of LISP - with a distinct Scheme flavour. But SLIP is also a sequence of interpreters, starting with a 100 line fully metacircular version. In the spirit of Friedman's EOPL, this version is rewritten in continuation passing style and translated into C in a straightforward way. Twelve successive versions introduce features such as trampolines, lexical addressing and garbage collection, to end with a fully optimized version that executes a simple benchmark on par with the PLT Scheme interpreter. SLIP is a chain of implementations presented as an instruction tool. It is also an experimentation tool, and this presentation will present a 13th version that introduces simple futures into SLIP in view of experimenting with multi-core systems. SLIP has been used in the Francqui chair (soft.vub.ac.be/francqui) earlier this year, and already twice in the Programming Language Engineering (PLE) course. It will again be used - including version 13 - in this year's issue of PLE. 12 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 12
Theo D’Hondt SLIP: a simple language implementation platform •••update••• (begin ¡ ¡(define ¡(Sort ¡V ¡Low ¡High ¡Recurse) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡... ¡ ¡ ¡ ¡(Recurse ¡Left ¡Right)) ¡ ¡(define ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(define ¡(SingleCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Left ¡High))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡SingleCore-‑Recurse)) ¡ ¡(define ¡(MultiCore-‑QuickSort ¡Depth ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(define ¡(MultiCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡Depth ¡0) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡promise ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(spawn ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Low ¡Right)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Left ¡High)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(sync ¡promise)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(collect)))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡MultiCore-‑Recurse)) 13 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 13
Theo D’Hondt SLIP: a simple language implementation platform •••update••• (begin ¡ ¡(define ¡(Sort ¡V ¡Low ¡High ¡Recurse) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡... ¡ ¡ ¡ ¡(Recurse ¡Left ¡Right)) ¡ ¡(define ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(define ¡(SingleCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Left ¡High))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡SingleCore-‑Recurse)) ¡ ¡(define ¡(MultiCore-‑QuickSort ¡Depth ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(define ¡(MultiCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡Depth ¡0) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡promise ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(spawn ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Low ¡Right)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Left ¡High)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(sync ¡promise)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(collect)))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡MultiCore-‑Recurse)) 14 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 14
Theo D’Hondt SLIP: a simple language implementation platform •••update••• (begin ¡ ¡(define ¡(Sort ¡V ¡Low ¡High ¡Recurse) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡... cpSlip/c ¡version ¡13: ¡multithreading >>>(eval ¡(read ¡"quadcoreQuickSort.scm")) ¡ ¡ ¡ ¡(Recurse ¡Left ¡Right)) quadcore ¡quicksort ¡of ¡100000 ¡integers ¡ ¡(define ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ... ¡Collecting ¡109145 ¡cells ¡into ¡103092 ¡cells ¡in ¡0.003919 ¡seconds ¡ ¡ ¡ ¡(define ¡(SingleCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ... ¡Collecting ¡339952 ¡cells ¡into ¡106248 ¡cells ¡in ¡0.006443 ¡seconds ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ... ¡Collecting ¡940109 ¡cells ¡into ¡105837 ¡cells ¡in ¡0.01088 ¡seconds ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Left ¡High))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡SingleCore-‑Recurse)) ... ¡Collecting ¡501743 ¡cells ¡into ¡105810 ¡cells ¡in ¡0.003370 ¡seconds ¡ ¡elapsed ¡time ¡= ¡12 ¡secs ¡ ¡(define ¡(MultiCore-‑QuickSort ¡Depth ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(define ¡(MultiCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡Depth ¡0) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡promise ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(spawn ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Low ¡Right)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Left ¡High)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(sync ¡promise)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(collect)))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡MultiCore-‑Recurse)) 15 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 15
Theo D’Hondt SLIP: a simple language implementation platform Agenda motivation history: Pico (1&2), Pic%, ˈ sk ē m SLIP SLIP in cps SLIP in C multicore SLIP 16 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 16
Theo D’Hondt SLIP: a simple language implementation platform Motivation ➜ 17 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 17
Theo D’Hondt SLIP: a simple language implementation platform Motivation ➜ First principles Bare metal 18 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 18
Theo D’Hondt SLIP: a simple language implementation platform Motivation (cont’d) 19 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 19
Theo D’Hondt SLIP: a simple language implementation platform History: Pico 1 /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡>>>Pico<<< ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Theo ¡D'Hondt ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /* ¡ ¡ ¡VUB ¡Programming ¡Technology ¡Lab ¡ ¡*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(c) ¡1997 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Main ¡program ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ #define ¡NDEBUG #include ¡ <float.h> #include ¡ <limits.h> #include ¡ <setjmp.h> /* ¡private ¡constants ¡*/ #define ¡FUN_NAM_INDEX ¡ 1 #define ¡FUN_ARG_INDEX ¡ 2 #define ¡FUN_EXP_INDEX ¡ 3 #define ¡FUN_DCT_INDEX ¡ 4 #define ¡NAT_NAM_INDEX ¡ 1 #define ¡NAT_NBR_INDEX ¡ 2 #define ¡VAR_NAM_INDEX ¡ 1 #define ¡APL_NAM_INDEX ¡ 1 #define ¡APL_ARG_INDEX ¡ 2 #define ¡TBL_NAM_INDEX ¡ 1 #define ¡TBL_IDX_INDEX ¡ 2 #define ¡DEF_INV_INDEX ¡ 1 #define ¡DEF_EXP_INDEX ¡ 2 #define ¡SET_INV_INDEX ¡ 1 20 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 20
Theo D’Hondt SLIP: a simple language implementation platform History: Pico 1 /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡>>>Pico<<< ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Theo ¡D'Hondt ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /* ¡ ¡ ¡VUB ¡Programming ¡Technology ¡Lab ¡ ¡*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(c) ¡1997 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Main ¡program ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ #define ¡NDEBUG #include ¡ <float.h> #include ¡ <limits.h> #include ¡ <setjmp.h> /* ¡private ¡constants ¡*/ #define ¡FUN_NAM_INDEX ¡ 1 #define ¡FUN_ARG_INDEX ¡ 2 #define ¡FUN_EXP_INDEX ¡ 3 #define ¡FUN_DCT_INDEX ¡ 4 #define ¡NAT_NAM_INDEX ¡ 1 #define ¡NAT_NBR_INDEX ¡ 2 #define ¡VAR_NAM_INDEX ¡ 1 #define ¡APL_NAM_INDEX ¡ 1 #define ¡APL_ARG_INDEX ¡ 2 #define ¡TBL_NAM_INDEX ¡ 1 #define ¡TBL_IDX_INDEX ¡ 2 #define ¡DEF_INV_INDEX ¡ 1 #define ¡DEF_EXP_INDEX ¡ 2 #define ¡SET_INV_INDEX ¡ 1 21 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 21
Theo D’Hondt SLIP: a simple language implementation platform History: Pico 1 /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡>>>Pico<<< ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Theo ¡D'Hondt ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /* ¡ ¡ ¡VUB ¡Programming ¡Technology ¡Lab ¡ ¡*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(c) ¡1997 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Main ¡program ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ #define ¡NDEBUG #include ¡ <float.h> #include ¡ <limits.h> #include ¡ <setjmp.h> /* ¡private ¡constants ¡*/ #define ¡FUN_NAM_INDEX ¡ 1 #define ¡FUN_ARG_INDEX ¡ 2 #define ¡FUN_EXP_INDEX ¡ 3 #define ¡FUN_DCT_INDEX ¡ 4 #define ¡NAT_NAM_INDEX ¡ 1 #define ¡NAT_NBR_INDEX ¡ 2 #define ¡VAR_NAM_INDEX ¡ 1 #define ¡APL_NAM_INDEX ¡ 1 #define ¡APL_ARG_INDEX ¡ 2 #define ¡TBL_NAM_INDEX ¡ 1 #define ¡TBL_IDX_INDEX ¡ 2 #define ¡DEF_INV_INDEX ¡ 1 #define ¡DEF_EXP_INDEX ¡ 2 #define ¡SET_INV_INDEX ¡ 1 22 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 22
Theo D’Hondt SLIP: a simple language implementation platform History: Pico 1 /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡>>>Pico<<< ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Theo ¡D'Hondt ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /* ¡ ¡ ¡VUB ¡Programming ¡Technology ¡Lab ¡ ¡*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(c) ¡1997 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Main ¡program ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ #define ¡NDEBUG #include ¡ <float.h> #include ¡ <limits.h> #include ¡ <setjmp.h> /* ¡private ¡constants ¡*/ #define ¡FUN_NAM_INDEX ¡ 1 #define ¡FUN_ARG_INDEX ¡ 2 #define ¡FUN_EXP_INDEX ¡ 3 #define ¡FUN_DCT_INDEX ¡ 4 #define ¡NAT_NAM_INDEX ¡ 1 #define ¡NAT_NBR_INDEX ¡ 2 #define ¡VAR_NAM_INDEX ¡ 1 #define ¡APL_NAM_INDEX ¡ 1 #define ¡APL_ARG_INDEX ¡ 2 #define ¡TBL_NAM_INDEX ¡ 1 #define ¡TBL_IDX_INDEX ¡ 2 #define ¡DEF_INV_INDEX ¡ 1 #define ¡DEF_EXP_INDEX ¡ 2 #define ¡SET_INV_INDEX ¡ 1 23 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 23
Theo D’Hondt SLIP: a simple language implementation platform History: Pico 1 /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡>>>Pico<<< ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Theo ¡D'Hondt ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /* ¡ ¡ ¡VUB ¡Programming ¡Technology ¡Lab ¡ ¡*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(c) ¡1997 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ /* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Main ¡program ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ #define ¡NDEBUG #include ¡ <float.h> #include ¡ <limits.h> #include ¡ <setjmp.h> /* ¡private ¡constants ¡*/ #define ¡FUN_NAM_INDEX ¡ 1 #define ¡FUN_ARG_INDEX ¡ 2 #define ¡FUN_EXP_INDEX ¡ 3 #define ¡FUN_DCT_INDEX ¡ 4 #define ¡NAT_NAM_INDEX ¡ 1 #define ¡NAT_NBR_INDEX ¡ 2 #define ¡VAR_NAM_INDEX ¡ 1 #define ¡APL_NAM_INDEX ¡ 1 #define ¡APL_ARG_INDEX ¡ 2 #define ¡TBL_NAM_INDEX ¡ 1 #define ¡TBL_IDX_INDEX ¡ 2 #define ¡DEF_INV_INDEX ¡ 1 #define ¡DEF_EXP_INDEX ¡ 2 #define ¡SET_INV_INDEX ¡ 1 24 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 24
Theo D’Hondt SLIP: a simple language implementation platform History: Pic% 25 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 25
Theo D’Hondt SLIP: a simple language implementation platform History: Pic% 26 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 26
Theo D’Hondt SLIP: a simple language implementation platform History: Pic% 27 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 27
Theo D’Hondt SLIP: a simple language implementation platform History: Pic% 28 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 28
Theo D’Hondt SLIP: a simple language implementation platform History: Pico 2 1st class ∀ no compromises abstract grammars uniform memory continuations interpretation 29 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 29
Theo D’Hondt SLIP: a simple language implementation platform History: \ ˈ sk ē m\ 30 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 30
Theo D’Hondt SLIP: a simple language implementation platform SLIP: design performance,performance,performance smallest possible footprint (loc, kb) abstract syntax everywhere no compromises or limitations minimal dynamic language main focus on interpretation clean code incremental implementation 31 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 31
Theo D’Hondt SLIP: a simple language implementation platform SLIP: the language (begin ¡ ¡(define ¡(counter ¡count) ¡ ¡ ¡ ¡(define ¡(self ¡message) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡message ¡'+) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡count ¡(+ ¡count ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡self) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡message ¡'-‑) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡count ¡(-‑ ¡count ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡self) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡message ¡'?) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡count ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡'error)))) ¡ ¡ ¡ ¡ ¡ ¡self) ¡ ¡(define ¡c ¡(counter ¡10)) ¡ ¡((((c ¡'+) ¡'+) ¡'-‑) ¡'?)) 32 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 32
Theo D’Hondt SLIP: a simple language implementation platform SLIP: the language (cont’d) (begin ¡ ¡(define ¡empty ¡ ¡ ¡0) ¡ ¡(define ¡full ¡ ¡ ¡ ¡1) ¡ ¡(define ¡push ¡ ¡ ¡ ¡2) ¡ ¡(define ¡pop ¡ ¡ ¡ ¡ ¡3) ¡ ¡(define ¡S ¡(Stack ¡10)) ¡ ¡(define ¡(Stack ¡n) ¡ ¡(define ¡T ¡(Stack ¡20)) ¡ ¡ ¡ ¡(define ¡stack ¡(make-‑vector ¡n)) ¡ ¡(if ¡(S ¡full) ¡ ¡ ¡ ¡(define ¡top ¡-‑1) ¡ ¡ ¡ ¡(display ¡'Overflow) ¡ ¡ ¡ ¡(define ¡(empty) ¡ ¡ ¡ ¡(S ¡push ¡123)) ¡ ¡ ¡ ¡ ¡ ¡(< ¡top ¡0)) ¡ ¡(T ¡push ¡456) ¡ ¡ ¡ ¡(define ¡(full) ¡ ¡(if ¡(S ¡empty) ¡ ¡ ¡ ¡ ¡ ¡(>= ¡top ¡n)) ¡ ¡ ¡ ¡(display ¡'Underflow) ¡ ¡ ¡ ¡(define ¡(push ¡item) ¡ ¡ ¡ ¡(S ¡pop)) ¡ ¡ ¡ ¡ ¡ ¡(set! ¡top ¡(+ ¡top ¡1)) ¡ ¡(display ¡(T ¡pop)) ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡stack ¡top ¡item) ¡ ¡(newline) ¡ ¡ ¡ ¡ ¡ ¡()) ¡ ¡(if ¡(S ¡empty) ¡ ¡ ¡ ¡(define ¡(pop) ¡ ¡ ¡ ¡(display ¡'Underflow) ¡ ¡ ¡ ¡ ¡ ¡(define ¡item ¡(vector-‑ref ¡stack ¡top)) ¡ ¡ ¡ ¡(S ¡pop))) ¡ ¡ ¡ ¡ ¡ ¡(set! ¡top ¡(-‑ ¡top ¡1)) ¡ ¡ ¡ ¡ ¡ ¡item) ¡ ¡ ¡ ¡(define ¡(self ¡message ¡. ¡arguments) ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡methods ¡(vector ¡empty ¡full ¡push ¡pop)) ¡ ¡ ¡ ¡ ¡ ¡(apply ¡(vector-‑ref ¡methods ¡message) ¡arguments)) ¡ ¡ ¡ ¡self) 33 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 33
Theo D’Hondt SLIP: a simple language implementation platform SLIP: the language (cont’d) begin , define , if , lambda , set! (, while ) define and set! have a value define used anywhere () instead of '() local variables ≈ parameters no forward references natives inherited from metalevel no top-level sequences 34 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 34
Theo D’Hondt SLIP: a simple language implementation platform A Scheme interpreter for SLIP (begin ¡ ¡ ¡(define ¡environment ¡'()) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡boolean ¡#f) ¡ ¡(define ¡(loop ¡output) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡alternative) ¡ ¡ ¡ ¡(define ¡rollback ¡environment) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡consequent))) ¡ ¡ ¡ ¡(define ¡(error ¡message ¡qualifier) ¡ ¡ ¡ ¡(define ¡(evaluate-‑lambda ¡parameters ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(display ¡message) ¡ ¡ ¡ ¡ ¡ ¡(make-‑procedure ¡parameters ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡rollback) ¡ ¡ ¡ ¡(define ¡(evaluate-‑set! ¡variable ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(loop ¡qualifier)) ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(assoc ¡variable ¡environment)) ¡ ¡ ¡ ¡(define ¡(bind-‑variable ¡variable ¡value) ¡ ¡ ¡ ¡ ¡ ¡(if ¡binding ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(cons ¡variable ¡value)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(let ¡((value ¡(evaluate ¡expression))) ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set-‑cdr! ¡binding ¡value) ¡ ¡ ¡ ¡(define ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡value) ¡ ¡ ¡ ¡ ¡ ¡(for-‑each ¡bind-‑variable ¡parameters ¡arguments)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(error ¡"inaccessible ¡variable: ¡" ¡variable))) ¡ ¡ ¡ ¡(define ¡(evaluate-‑sequence ¡expressions) ¡ ¡ ¡ ¡(define ¡(evaluate-‑variable ¡variable) ¡ ¡ ¡ ¡ ¡ ¡(define ¡head ¡(car ¡expressions)) ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(assoc ¡variable ¡environment)) ¡ ¡ ¡ ¡ ¡ ¡(define ¡tail ¡(cdr ¡expressions)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡binding ¡ ¡ ¡ ¡ ¡ ¡(if ¡(null? ¡tail) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(cdr ¡binding) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡head) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(eval ¡variable ¡(interaction-‑environment)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑sequence ¡tail))) ¡ ¡ ¡ ¡(define ¡(evaluate ¡expression) ¡ ¡ ¡ ¡(define ¡(make-‑procedure ¡parameters ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(cond ¡ ¡ ¡ ¡ ¡ ¡(define ¡lexical-‑scope ¡environment) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((symbol? ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(lambda ¡arguments ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑variable ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡dynamic-‑scope ¡environment) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((pair? ¡expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡lexical-‑scope) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(let ¡((operator ¡(car ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(operands ¡(cdr ¡expression))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(let ¡((value ¡(evaluate ¡expression))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(apply ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡dynamic-‑scope) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(case ¡operator ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡value))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((begin) ¡ ¡evaluate-‑begin ¡) ¡ ¡ ¡ ¡(define ¡(evaluate-‑application ¡operator) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((define) ¡evaluate-‑define) ¡ ¡ ¡ ¡ ¡ ¡(lambda ¡operands ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((if) ¡ ¡ ¡ ¡ ¡evaluate-‑if ¡ ¡ ¡ ¡) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(apply ¡(evaluate ¡operator) ¡(map ¡evaluate ¡operands)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((lambda) ¡evaluate-‑lambda) ¡ ¡ ¡ ¡(define ¡(evaluate-‑begin ¡. ¡expressions) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((set!) ¡ ¡ ¡evaluate-‑set! ¡ ¡) ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑sequence ¡expressions)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(else ¡ ¡ ¡ ¡ ¡(evaluate-‑application ¡operator))) ¡operands))) ¡ ¡ ¡ ¡(define ¡(evaluate-‑define ¡variable ¡expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(else ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(cons ¡variable ¡'())) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡expression))); ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment)) ¡ ¡ ¡ ¡(display ¡output) ¡ ¡ ¡ ¡ ¡ ¡(let ¡((value ¡(evaluate ¡expression))) ¡ ¡ ¡ ¡(newline) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set-‑cdr! ¡binding ¡value) ¡ ¡ ¡ ¡(display ¡">>>") ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡value)) ¡ ¡ ¡ ¡(loop ¡(evaluate ¡(read)))) ¡ ¡ ¡ ¡(define ¡(evaluate-‑if ¡predicate ¡consequent ¡alternative) ¡ ¡(loop ¡"Slip ¡version ¡0")) ¡ ¡ ¡ ¡ ¡ ¡(define ¡boolean ¡(evaluate ¡predicate)) 35 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 35
Theo D’Hondt SLIP: a simple language implementation platform A Scheme interpreter for SLIP (begin ¡ ¡ ¡(define ¡environment ¡'()) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡boolean ¡#f) ¡ ¡(define ¡(loop ¡output) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡alternative) ¡ ¡ ¡ ¡(define ¡rollback ¡environment) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡consequent))) ¡ ¡ ¡ ¡(define ¡(error ¡message ¡qualifier) ¡ ¡ ¡ ¡(define ¡(evaluate-‑lambda ¡parameters ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(display ¡message) ¡ ¡ ¡ ¡ ¡ ¡(make-‑procedure ¡parameters ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡rollback) ¡ ¡ ¡ ¡(define ¡(evaluate-‑set! ¡variable ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(loop ¡qualifier)) ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(assoc ¡variable ¡environment)) ¡ ¡ ¡ ¡(define ¡(bind-‑variable ¡variable ¡value) ¡ ¡ ¡ ¡ ¡ ¡(if ¡binding ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(cons ¡variable ¡value)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(let ¡((value ¡(evaluate ¡expression))) ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set-‑cdr! ¡binding ¡value) ¡ ¡ ¡ ¡(define ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡value) ¡ ¡ ¡ ¡ ¡ ¡(for-‑each ¡bind-‑variable ¡parameters ¡arguments)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(error ¡"inaccessible ¡variable: ¡" ¡variable))) ¡ ¡ ¡ ¡(define ¡(evaluate-‑sequence ¡expressions) ¡ ¡ ¡ ¡(define ¡(evaluate-‑variable ¡variable) ¡ ¡ ¡ ¡ ¡ ¡(define ¡head ¡(car ¡expressions)) ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(assoc ¡variable ¡environment)) ¡ ¡ ¡ ¡ ¡ ¡(define ¡tail ¡(cdr ¡expressions)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡binding ¡ ¡ ¡ ¡ ¡ ¡(if ¡(null? ¡tail) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(cdr ¡binding) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡head) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(eval ¡variable ¡(interaction-‑environment)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑sequence ¡tail))) ¡ ¡ ¡ ¡(define ¡(evaluate ¡expression) ¡ ¡ ¡ ¡(define ¡(make-‑procedure ¡parameters ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(cond ¡ ¡ ¡ ¡ ¡ ¡(define ¡lexical-‑scope ¡environment) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((symbol? ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(lambda ¡arguments ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑variable ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡dynamic-‑scope ¡environment) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((pair? ¡expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡lexical-‑scope) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(let ¡((operator ¡(car ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(operands ¡(cdr ¡expression))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(let ¡((value ¡(evaluate ¡expression))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(apply ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡dynamic-‑scope) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(case ¡operator ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡value))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((begin) ¡ ¡evaluate-‑begin ¡) ¡ ¡ ¡ ¡(define ¡(evaluate-‑application ¡operator) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((define) ¡evaluate-‑define) ¡ ¡ ¡ ¡ ¡ ¡(lambda ¡operands ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((if) ¡ ¡ ¡ ¡ ¡evaluate-‑if ¡ ¡ ¡ ¡) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(apply ¡(evaluate ¡operator) ¡(map ¡evaluate ¡operands)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((lambda) ¡evaluate-‑lambda) ¡ ¡ ¡ ¡(define ¡(evaluate-‑begin ¡. ¡expressions) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((set!) ¡ ¡ ¡evaluate-‑set! ¡ ¡) ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑sequence ¡expressions)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(else ¡ ¡ ¡ ¡ ¡(evaluate-‑application ¡operator))) ¡operands))) ¡ ¡ ¡ ¡(define ¡(evaluate-‑define ¡variable ¡expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(else ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(cons ¡variable ¡'())) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡expression))); ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment)) ¡ ¡ ¡ ¡(display ¡output) ¡ ¡ ¡ ¡ ¡ ¡(let ¡((value ¡(evaluate ¡expression))) ¡ ¡ ¡ ¡(newline) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set-‑cdr! ¡binding ¡value) ¡ ¡ ¡ ¡(display ¡">>>") ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡value)) ¡ ¡ ¡ ¡(loop ¡(evaluate ¡(read)))) ¡ ¡ ¡ ¡(define ¡(evaluate-‑if ¡predicate ¡consequent ¡alternative) ¡ ¡(loop ¡"Slip ¡version ¡0")) ¡ ¡ ¡ ¡ ¡ ¡(define ¡boolean ¡(evaluate ¡predicate)) 36 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 36
Theo D’Hondt SLIP: a simple language implementation platform A metacircular SLIP interpreter (begin ¡ ¡(define ¡circularity-‑level ¡(+ ¡circularity-‑level ¡1)) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(evaluate-‑application ¡operator) ¡ ¡(define ¡meta-‑level-‑eval ¡eval) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(lambda ¡operands ¡ ¡ ¡ ¡ ¡ ¡(define ¡(evaluate-‑variable ¡variable) ¡ ¡(define ¡eval ¡()) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(apply ¡(evaluate ¡operator) ¡(map ¡evaluate ¡operands)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(assoc ¡variable ¡environment)) ¡ ¡(define ¡environment ¡()) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(evaluate-‑begin ¡. ¡expressions) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(pair? ¡binding) ¡ ¡(define ¡(loop ¡output) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑sequence ¡expressions)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(cdr ¡binding) ¡ ¡ ¡ ¡(define ¡rollback ¡environment) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(evaluate-‑define ¡pattern ¡. ¡expressions) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(meta-‑level-‑eval ¡variable))) ¡ ¡ ¡ ¡(define ¡(evaluate ¡expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(symbol? ¡pattern) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(evaluate-‑while ¡predicate ¡. ¡expressions) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(error ¡message ¡qualifier) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡(iterate ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(display ¡message) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡value ¡(evaluate ¡(car ¡expressions))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡boolean ¡(evaluate ¡predicate)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡rollback) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(cons ¡pattern ¡value)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡boolean ¡#f) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(loop ¡qualifier)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡value ¡ ¡ ¡ ¡ ¡ ¡(define ¡(bind-‑variable ¡variable ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(iterate ¡(evaluate-‑sequence ¡expressions)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(cons ¡variable ¡value)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(iterate ¡())) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(cons ¡(car ¡pattern) ¡())) ¡ ¡ ¡ ¡ ¡(if ¡(symbol? ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑variable ¡expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(symbol? ¡parameters) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡procedure ¡(make-‑procedure ¡(cdr ¡pattern) ¡expressions)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(pair? ¡expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑variable ¡parameters ¡arguments) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set-‑cdr! ¡binding ¡procedure) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(pair? ¡parameters) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡procedure))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡operator ¡(car ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡(evaluate-‑if ¡predicate ¡consequent ¡. ¡alternative) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡operands ¡(cdr ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡variable ¡(car ¡parameters)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡boolean ¡(evaluate ¡predicate)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(apply ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡value ¡(car ¡arguments ¡)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡boolean ¡#f) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡operator ¡'begin) ¡evaluate-‑begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑variable ¡variable ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(null? ¡alternative) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡operator ¡'define) ¡evaluate-‑define ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑parameters ¡(cdr ¡parameters) ¡(cdr ¡arguments)))))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡() ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡operator ¡'if) ¡evaluate-‑if ¡ ¡ ¡ ¡ ¡ ¡(define ¡(evaluate-‑sequence ¡expressions) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡(car ¡alternative))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡operator ¡'lambda) ¡evaluate-‑lambda ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡head ¡(car ¡expressions)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡consequent))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡operator ¡'quote) ¡evaluate-‑quote ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡tail ¡(cdr ¡expressions)) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(evaluate-‑lambda ¡parameters ¡. ¡expressions) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡operator ¡'set!) ¡evaluate-‑set! ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(null? ¡tail) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(make-‑procedure ¡parameters ¡expressions)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(eq? ¡operator ¡'while) ¡evaluate-‑while ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡head) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(evaluate-‑quote ¡expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑application ¡operator)))))))) ¡operands)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡expression))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡head) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(evaluate-‑set! ¡variable ¡expression) ¡ ¡ ¡ ¡(display ¡output) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑sequence ¡tail)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡value ¡(evaluate ¡expression)) ¡ ¡ ¡ ¡(newline) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(make-‑procedure ¡parameters ¡expressions) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(assoc ¡variable ¡environment)) ¡ ¡ ¡ ¡(display ¡"level ¡") ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡lexical-‑environment ¡environment) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(pair? ¡binding) ¡ ¡ ¡ ¡(display ¡circularity-‑level) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(lambda ¡arguments ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡(display ¡">") ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡dynamic-‑environment ¡environment) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡value ¡(evaluate ¡expression)) ¡ ¡ ¡ ¡(set! ¡eval ¡evaluate) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡lexical-‑environment) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set-‑cdr! ¡binding ¡value) ¡ ¡ ¡ ¡(loop ¡(evaluate ¡(read)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡value) ¡ ¡(loop ¡"Meta-‑Circular ¡Slip")) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡value ¡(evaluate-‑sequence ¡expressions)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(error ¡"inaccessible ¡variable: ¡" ¡variable))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡dynamic-‑environment) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡value)) 37 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 37
Theo D’Hondt SLIP: a simple language implementation platform A metacircular SLIP interpreter (cont'd) (begin ¡ ¡(define ¡circularity-‑level ¡0) ¡ ¡(define ¡meta-‑level-‑eval ¡eval) ¡ ¡(define ¡eval ¡'()) ¡ ¡ ¡ ¡(loop ¡(evaluate ¡(read)))) ¡ ¡(loop ¡"Root-‑Level ¡Slip" ¡'())) Slip ¡version ¡3 >>> (begin ¡ ¡(define ¡circularity-‑level ¡(+ ¡circularity-‑level ¡1)) ¡ ¡(define ¡meta-‑level-‑eval ¡eval) ¡ ¡(define ¡eval ¡()) ¡ ¡(define ¡environment ¡()) ¡ ¡(define ¡(loop ¡output) ¡ ¡ ¡ ¡(define ¡rollback ¡environment) ¡ ¡(loop ¡"Meta-‑Circular ¡Slip" ¡())) Meta-‑Circular ¡Slip level ¡1> (begin ¡ ¡(define ¡circularity-‑level ¡(+ ¡circularity-‑level ¡1)) ¡ ¡(loop ¡"Meta-‑Circular ¡Slip" ¡())) Meta-‑Circular ¡Slip level ¡2> (begin ¡ ¡(define ¡circularity-‑level ¡(+ ¡circularity-‑level ¡1)) ¡ ¡(loop ¡"Meta-‑Circular ¡Slip" ¡())) Meta-‑Circular ¡Slip level ¡3>(+ ¡1 ¡2) 3 level ¡3> 38 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 38
Theo D’Hondt SLIP: a simple language implementation platform A metacircular SLIP interpreter (cont'd) (define ¡(evaluate-‑sequence ¡expressions) ¡ ¡(define ¡head ¡(car ¡expressions)) (define ¡environment ¡()) ¡ ¡(define ¡tail ¡(cdr ¡expressions)) ¡ ¡(if ¡(null? ¡tail) ¡ ¡ ¡ ¡(evaluate ¡head) (define ¡(make-‑procedure ¡parameters ¡expressions) ¡ ¡ ¡ ¡(begin ¡ ¡(define ¡lexical-‑environment ¡environment) ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡head) (define ¡(bind-‑variable ¡variable ¡value) ¡ ¡(lambda ¡arguments ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑sequence ¡tail)))) ¡ ¡(define ¡binding ¡(cons ¡variable ¡value)) ¡ ¡ ¡ ¡(define ¡dynamic-‑environment ¡environment) ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment))) ¡ ¡ ¡ ¡(set! ¡environment ¡lexical-‑environment) (define ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡ ¡ ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡(if ¡(symbol? ¡parameters) ¡ ¡ ¡ ¡(define ¡value ¡(evaluate-‑sequence ¡expressions)) ¡ ¡ ¡ ¡(bind-‑variable ¡parameters ¡arguments) ¡ ¡ ¡ ¡(set! ¡environment ¡dynamic-‑environment) ¡ ¡ ¡ ¡(if ¡(pair? ¡parameters) ¡ ¡ ¡ ¡value)) ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡variable ¡(car ¡parameters)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡value ¡(car ¡arguments ¡)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑variable ¡variable ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑parameters ¡(cdr ¡parameters) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(cdr ¡arguments)))))) (define ¡(evaluate-‑application ¡operator) ¡ ¡(lambda ¡operands ¡ ¡ ¡ ¡(apply ¡(evaluate ¡operator) ¡(map ¡evaluate ¡operands)))) 39 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 39
Theo D’Hondt SLIP: a simple language implementation platform A metacircular SLIP interpreter (cont'd) (define ¡(evaluate-‑sequence ¡expressions) ¡ ¡(define ¡head ¡(car ¡expressions)) (define ¡environment ¡()) ¡ ¡(define ¡tail ¡(cdr ¡expressions)) ¡ ¡(if ¡(null? ¡tail) ¡ ¡ ¡ ¡(evaluate ¡head) (define ¡(make-‑procedure ¡parameters ¡expressions) ¡ ¡ ¡ ¡(begin ¡ ¡(define ¡lexical-‑environment ¡environment) ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡head) (define ¡(bind-‑variable ¡variable ¡value) ¡ ¡(lambda ¡arguments ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑sequence ¡tail)))) ¡ ¡(define ¡binding ¡(cons ¡variable ¡value)) ¡ ¡ ¡ ¡(define ¡dynamic-‑environment ¡environment) ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment))) ¡ ¡ ¡ ¡(set! ¡environment ¡lexical-‑environment) (define ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡ ¡ ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡(if ¡(symbol? ¡parameters) ¡ ¡ ¡ ¡(define ¡value ¡(evaluate-‑sequence ¡expressions)) ¡ ¡ ¡ ¡(bind-‑variable ¡parameters ¡arguments) ¡ ¡ ¡ ¡(set! ¡environment ¡dynamic-‑environment) ¡ ¡ ¡ ¡(if ¡(pair? ¡parameters) ¡ ¡ ¡ ¡value)) ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡variable ¡(car ¡parameters)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡value ¡(car ¡arguments ¡)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑variable ¡variable ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑parameters ¡(cdr ¡parameters) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(cdr ¡arguments)))))) (define ¡(evaluate-‑application ¡operator) ¡ ¡(lambda ¡operands ¡ ¡ ¡ ¡(apply ¡(evaluate ¡operator) ¡(map ¡evaluate ¡operands)))) 40 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 40
Theo D’Hondt SLIP: a simple language implementation platform A metacircular SLIP interpreter (cont'd) (define ¡(evaluate-‑sequence ¡expressions) ¡ ¡(define ¡head ¡(car ¡expressions)) (define ¡environment ¡()) ¡ ¡(define ¡tail ¡(cdr ¡expressions)) ¡ ¡(if ¡(null? ¡tail) ¡ ¡ ¡ ¡(evaluate ¡head) (define ¡(make-‑procedure ¡parameters ¡expressions) ¡ ¡ ¡ ¡(begin ¡ ¡(define ¡lexical-‑environment ¡environment) ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡head) (define ¡(bind-‑variable ¡variable ¡value) ¡ ¡(lambda ¡arguments ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑sequence ¡tail)))) ¡ ¡(define ¡binding ¡(cons ¡variable ¡value)) ¡ ¡ ¡ ¡(define ¡dynamic-‑environment ¡environment) ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment))) ¡ ¡ ¡ ¡(set! ¡environment ¡lexical-‑environment) (define ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡ ¡ ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡(if ¡(symbol? ¡parameters) ¡ ¡ ¡ ¡(define ¡value ¡(evaluate-‑sequence ¡expressions)) ¡ ¡ ¡ ¡(bind-‑variable ¡parameters ¡arguments) ¡ ¡ ¡ ¡(set! ¡environment ¡dynamic-‑environment) ¡ ¡ ¡ ¡(if ¡(pair? ¡parameters) ¡ ¡ ¡ ¡value)) ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡variable ¡(car ¡parameters)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡value ¡(car ¡arguments ¡)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑variable ¡variable ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑parameters ¡(cdr ¡parameters) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(cdr ¡arguments)))))) (define ¡(evaluate-‑application ¡operator) ¡ ¡(lambda ¡operands ¡ ¡ ¡ ¡(apply ¡(evaluate ¡operator) ¡(map ¡evaluate ¡operands)))) 41 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 41
Theo D’Hondt SLIP: a simple language implementation platform A metacircular SLIP interpreter (cont'd) (define ¡(evaluate-‑sequence ¡expressions) ¡ ¡(define ¡head ¡(car ¡expressions)) (define ¡environment ¡()) ¡ ¡(define ¡tail ¡(cdr ¡expressions)) ¡ ¡(if ¡(null? ¡tail) ¡ ¡ ¡ ¡(evaluate ¡head) (define ¡(make-‑procedure ¡parameters ¡expressions) ¡ ¡ ¡ ¡(begin ¡ ¡(define ¡lexical-‑environment ¡environment) ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡head) (define ¡(bind-‑variable ¡variable ¡value) ¡ ¡(lambda ¡arguments ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑sequence ¡tail)))) ¡ ¡(define ¡binding ¡(cons ¡variable ¡value)) ¡ ¡ ¡ ¡(define ¡dynamic-‑environment ¡environment) ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment))) ¡ ¡ ¡ ¡(set! ¡environment ¡lexical-‑environment) (define ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡ ¡ ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡(if ¡(symbol? ¡parameters) ¡ ¡ ¡ ¡(define ¡value ¡(evaluate-‑sequence ¡expressions)) ¡ ¡ ¡ ¡(bind-‑variable ¡parameters ¡arguments) ¡ ¡ ¡ ¡(set! ¡environment ¡dynamic-‑environment) ¡ ¡ ¡ ¡(if ¡(pair? ¡parameters) ¡ ¡ ¡ ¡value)) ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡variable ¡(car ¡parameters)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡value ¡(car ¡arguments ¡)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑variable ¡variable ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑parameters ¡(cdr ¡parameters) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(cdr ¡arguments)))))) (define ¡(evaluate-‑application ¡operator) ¡ ¡(lambda ¡operands ¡ ¡ ¡ ¡(apply ¡(evaluate ¡operator) ¡(map ¡evaluate ¡operands)))) 42 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 42
Theo D’Hondt SLIP: a simple language implementation platform A metacircular SLIP interpreter (cont'd) (define ¡(evaluate-‑sequence ¡expressions) ¡ ¡(define ¡head ¡(car ¡expressions)) (define ¡environment ¡()) ¡ ¡(define ¡tail ¡(cdr ¡expressions)) ¡ ¡(if ¡(null? ¡tail) ¡ ¡ ¡ ¡(evaluate ¡head) (define ¡(make-‑procedure ¡parameters ¡expressions) ¡ ¡ ¡ ¡(begin ¡ ¡(define ¡lexical-‑environment ¡environment) ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡head) (define ¡(bind-‑variable ¡variable ¡value) ¡ ¡(lambda ¡arguments ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑sequence ¡tail)))) ¡ ¡(define ¡binding ¡(cons ¡variable ¡value)) ¡ ¡ ¡ ¡(define ¡dynamic-‑environment ¡environment) ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment))) ¡ ¡ ¡ ¡(set! ¡environment ¡lexical-‑environment) (define ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡ ¡ ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡(if ¡(symbol? ¡parameters) ¡ ¡ ¡ ¡(define ¡value ¡(evaluate-‑sequence ¡expressions)) ¡ ¡ ¡ ¡(bind-‑variable ¡parameters ¡arguments) ¡ ¡ ¡ ¡(set! ¡environment ¡dynamic-‑environment) ¡ ¡ ¡ ¡(if ¡(pair? ¡parameters) ¡ ¡ ¡ ¡value)) ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡variable ¡(car ¡parameters)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡value ¡(car ¡arguments ¡)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑variable ¡variable ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑parameters ¡(cdr ¡parameters) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(cdr ¡arguments)))))) (define ¡(evaluate-‑application ¡operator) ¡ ¡(lambda ¡operands ¡ ¡ ¡ ¡(apply ¡(evaluate ¡operator) ¡(map ¡evaluate ¡operands)))) 43 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 43
Theo D’Hondt SLIP: a simple language implementation platform A metacircular SLIP interpreter (cont'd) (define ¡(evaluate-‑sequence ¡expressions) ¡ ¡(define ¡head ¡(car ¡expressions)) (define ¡environment ¡()) ¡ ¡(define ¡tail ¡(cdr ¡expressions)) ¡ ¡(if ¡(null? ¡tail) ¡ ¡ ¡ ¡(evaluate ¡head) (define ¡(make-‑procedure ¡parameters ¡expressions) ¡ ¡ ¡ ¡(begin ¡ ¡(define ¡lexical-‑environment ¡environment) ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡head) (define ¡(bind-‑variable ¡variable ¡value) ¡ ¡(lambda ¡arguments ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑sequence ¡tail)))) ¡ ¡(define ¡binding ¡(cons ¡variable ¡value)) ¡ ¡ ¡ ¡(define ¡dynamic-‑environment ¡environment) ¡ ¡(set! ¡environment ¡(cons ¡binding ¡environment))) ¡ ¡ ¡ ¡(set! ¡environment ¡lexical-‑environment) (define ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡ ¡ ¡(bind-‑parameters ¡parameters ¡arguments) ¡ ¡(if ¡(symbol? ¡parameters) ¡ ¡ ¡ ¡(define ¡value ¡(evaluate-‑sequence ¡expressions)) ¡ ¡ ¡ ¡(bind-‑variable ¡parameters ¡arguments) ¡ ¡ ¡ ¡(set! ¡environment ¡dynamic-‑environment) ¡ ¡ ¡ ¡(if ¡(pair? ¡parameters) ¡ ¡ ¡ ¡value)) ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡variable ¡(car ¡parameters)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡value ¡(car ¡arguments ¡)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑variable ¡variable ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(bind-‑parameters ¡(cdr ¡parameters) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(cdr ¡arguments)))))) (define ¡(evaluate-‑application ¡operator) ¡ ¡(lambda ¡operands ¡ ¡ ¡ ¡(apply ¡(evaluate ¡operator) ¡(map ¡evaluate ¡operands)))) 44 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 44
Theo D’Hondt SLIP: a simple language implementation platform SLIP in cps ¡ ¡ ¡ ¡(define ¡(evaluate ¡expression ¡continue) ¡ ¡ ¡ ¡ ¡ ¡(cond ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((symbol? ¡expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑variable ¡expression ¡continue)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((pair? ¡expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(let ¡((operator ¡(car ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(operands ¡(cdr ¡expression))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((apply ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(case ¡operator ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((begin) ¡ ¡evaluate-‑begin ¡) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((define) ¡evaluate-‑define) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((if) ¡ ¡ ¡ ¡ ¡evaluate-‑if ¡ ¡ ¡ ¡) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((lambda) ¡evaluate-‑lambda) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((quote) ¡ ¡evaluate-‑quote ¡) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((set!) ¡ ¡ ¡evaluate-‑set! ¡ ¡) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((while) ¡ ¡evaluate-‑while ¡) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(else ¡ ¡ ¡ ¡ ¡(evaluate-‑application ¡operator))) ¡operands) ¡continue))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(else ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(continue ¡expression)))) 45 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 45
Theo D’Hondt SLIP: a simple language implementation platform SLIP in cps ¡ ¡(define ¡environment ¡'()) ¡ ¡(define ¡(loop ¡output) ¡ ¡ ¡ ¡(define ¡rollback ¡environment) ¡ ¡ ¡ ¡(define ¡(evaluate ¡expression ¡continue) ¡ ¡ ¡ ¡ ¡ ¡(cond ¡ ¡ ¡ ¡(define ¡(error ¡message ¡qualifier) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((symbol? ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(set! ¡environment ¡rollback) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate-‑variable ¡expression ¡continue)) ¡ ¡ ¡ ¡ ¡ ¡(display ¡message) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((pair? ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(loop ¡qualifier)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(let ¡((operator ¡(car ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(operands ¡(cdr ¡expression))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((apply ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(case ¡operator ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((begin) ¡ ¡evaluate-‑begin ¡) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((define) ¡evaluate-‑define) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((if) ¡ ¡ ¡ ¡ ¡evaluate-‑if ¡ ¡ ¡ ¡) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((lambda) ¡evaluate-‑lambda) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((quote) ¡ ¡evaluate-‑quote ¡) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((set!) ¡ ¡ ¡evaluate-‑set! ¡ ¡) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡((while) ¡ ¡evaluate-‑while ¡) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(else ¡ ¡ ¡ ¡ ¡(evaluate-‑application ¡operator))) ¡operands) ¡continue))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(else ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(continue ¡expression)))) ¡ ¡ ¡ ¡(display ¡output) ¡ ¡ ¡ ¡(newline) ¡ ¡ ¡ ¡(display ¡">>>") ¡ ¡ ¡ ¡(evaluate ¡(read) ¡loop)) ¡ ¡(loop ¡"Meta-‑Circular ¡Slip")) 46 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 46
Theo D’Hondt SLIP: a simple language implementation platform SLIP in cps (cont'd) ¡ ¡(define ¡(evaluate-‑set! ¡variable ¡expression) ¡ ¡ ¡ ¡(lambda ¡(continue) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(continuation ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(assoc ¡variable ¡environment)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set-‑cdr! ¡binding ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(continue ¡value)) ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡expression ¡continuation))) ➦ ➦ (let ¡((operator ¡(car ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡(operands ¡(cdr ¡expression))) (define ¡(evaluate ¡expression ¡continue) ¡ ¡ ¡ ¡ ¡... ¡ ¡((apply ¡evaluate-‑set! ¡operands) ¡continue) ¡ ¡ ¡ ¡ ¡... ¡) 47 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 47
Theo D’Hondt SLIP: a simple language implementation platform SLIP in cps (cont'd) ¡ ¡(define ¡(evaluate-‑set! ¡variable ¡expression) ¡ ¡ ¡ ¡(lambda ¡(continue) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(continuation ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(assoc ¡variable ¡environment)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set-‑cdr! ¡binding ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(continue ¡value)) ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡expression ¡continuation))) ➦ ➦ currying (let ¡((operator ¡(car ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡(operands ¡(cdr ¡expression))) (define ¡(evaluate ¡expression ¡continue) ¡ ¡ ¡ ¡ ¡... ¡ ¡((apply ¡evaluate-‑set! ¡operands) ¡continue) ¡ ¡ ¡ ¡ ¡... ¡) 48 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 48
Theo D’Hondt SLIP: a simple language implementation platform SLIP in cps (cont'd) ¡ ¡(define ¡(evaluate-‑set! ¡variable ¡expression) ¡ ¡ ¡ ¡(lambda ¡(continue) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(continuation ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(assoc ¡variable ¡environment)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set-‑cdr! ¡binding ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(continue ¡value)) ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡expression ¡continuation))) ➦ ➦ continuation (let ¡((operator ¡(car ¡expression)) ¡ ¡ ¡ ¡ ¡ ¡(operands ¡(cdr ¡expression))) (define ¡(evaluate ¡expression ¡continue) ¡ ¡ ¡ ¡ ¡... ¡ ¡((apply ¡evaluate-‑set! ¡operands) ¡continue) ¡ ¡ ¡ ¡ ¡... ¡) 49 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 49
Theo D’Hondt SLIP: a simple language implementation platform SLIP in cps (cont'd) ¡ ¡ ¡ ¡(define ¡(wrap-‑native-‑procedure ¡native-‑procedure) ¡ ¡ ¡ ¡ ¡ ¡(lambda ¡(arguments ¡continue) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡native-‑value ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(apply ¡native-‑procedure ¡arguments)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(continue ¡native-‑value))) price to pay ... 50 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 50
Theo D’Hondt SLIP: a simple language implementation platform SLIP in cps (cont'd) ¡ ¡ ¡ ¡(define ¡(evaluate-‑set! ¡variable ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(lambda ¡(continue ¡environment) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡(continue-‑after-‑expression ¡value ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡environment-‑after-‑expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(assoc ¡variable ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡environment-‑after-‑expression)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡binding ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set-‑cdr! ¡binding ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(error ¡"inaccessible ¡variable: ¡" ¡variable)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(continue ¡value ¡environment-‑after-‑expression)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡expression ¡continue-‑after-‑expression ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡environment))) 51 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 51
Theo D’Hondt SLIP: a simple language implementation platform SLIP in cps (cont'd) ¡ ¡ ¡ ¡(define ¡(evaluate-‑set! ¡variable ¡expression) ¡ ¡ ¡ ¡ ¡ ¡(lambda ¡(continue ¡environment) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡(continue-‑after-‑expression ¡value ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡environment-‑after-‑expression) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡binding ¡(assoc ¡variable ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡environment-‑after-‑expression)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡binding ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set-‑cdr! ¡binding ¡value) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(error ¡"inaccessible ¡variable: ¡" ¡variable)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(continue ¡value ¡environment-‑after-‑expression)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(evaluate ¡expression ¡continue-‑after-‑expression ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡environment))) 52 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 52
Theo D’Hondt SLIP: a simple language implementation platform SLIP in C: continuations ¡ ¡(define ¡(fibonacci ¡n ¡continue) ¡ ¡ ¡ ¡(define ¡(continuation-‑1 ¡p) ¡ ¡ ¡ ¡ ¡ ¡(define ¡(continuation-‑2 ¡q) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(continue ¡(+ ¡p ¡q))) ¡ ¡ ¡ ¡ ¡ ¡(fibonacci ¡(-‑ ¡n ¡2) ¡continuation-‑2)) ¡ ¡ ¡ ¡(if ¡(> ¡n ¡1) ¡ ¡ ¡ ¡ ¡ ¡(fibonacci ¡(-‑ ¡n ¡1) ¡continuation-‑1) ? ¡ ¡ ¡ ¡ ¡ ¡(continue ¡1))) ➜ C (fibonacci ¡15 ¡display) 53 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 53
Theo D’Hondt SLIP: a simple language implementation platform SLIP in C: continuations (cont'd) No nested functions No garbage collection Static & weak typing No proper tail calls 54 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 54
Theo D’Hondt SLIP: a simple language implementation platform SLIP in C: continuations (cont'd) (begin (begin ¡ ¡(define ¡(factorial ¡n) ¡ ¡(define ¡(factorial ¡n ¡continue) ¡ ¡ ¡ ¡(if ¡(> ¡n ¡1) ¡ ¡ ¡ ¡(define ¡(continuation ¡p) ¡ ¡ ¡ ¡ ¡ ¡(* ¡n ¡(factorial ¡(-‑ ¡n ¡1))) (begin ¡ ¡ ¡ ¡ ¡ ¡(continue ¡(* ¡n ¡p))) ¡ ¡ ¡ ¡ ¡ ¡1)) ¡ ¡(define ¡(continuation ¡p ¡closure) ¡ ¡ ¡ ¡(if ¡(> ¡n ¡1) ¡ ¡(factorial ¡10)) ¡ ¡ ¡ ¡(let* ¡((n ¡(car ¡closure)) ¡ ¡ ¡ ¡ ¡ ¡(factorial ¡(-‑ ¡n ¡1) ¡continuation) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(continuation ¡(cadr ¡closure)) ¡ ¡ ¡ ¡ ¡ ¡(continue ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(nested-‑closure ¡(caddr ¡closure))) ¡ ¡(factorial ¡10 ¡display)) ¡ ¡ ¡ ¡ ¡ ¡(continuation ¡(* ¡n ¡p) ¡nested-‑closure))) ¡ ¡(define ¡(factorial ¡. ¡closure) ¡ ¡ ¡ ¡(define ¡n ¡(car ¡closure)) ¡ ¡ ¡ ¡(define ¡nested-‑continuation ¡(cadr ¡closure)) ¡ ¡ ¡ ¡(define ¡nested-‑closure ¡(caddr ¡closure)) ¡ ¡ ¡ ¡(if ¡(> ¡n ¡1) ¡ ¡ ¡ ¡ ¡ ¡(factorial ¡(-‑ ¡n ¡1) ¡continuation ¡closure) ¡ ¡ ¡ ¡ ¡ ¡(nested-‑continuation ¡1 ¡nested-‑closure))) ¡ ¡ ¡(define ¡(top-‑continuation ¡p ¡closure) ¡ ¡ ¡ ¡(display ¡p)) ¡ ¡(factorial ¡10 ¡top-‑continuation ¡'())) 55 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 55
Theo D’Hondt SLIP: a simple language implementation platform SLIP in C: continuations (cont'd) (begin (begin ¡ ¡(define ¡(factorial ¡n) ¡ ¡(define ¡(factorial ¡n ¡continue) ¡ ¡ ¡ ¡(if ¡(> ¡n ¡1) ¡ ¡ ¡ ¡(define ¡(continuation ¡p) ¡ ¡ ¡ ¡ ¡ ¡(* ¡n ¡(factorial ¡(-‑ ¡n ¡1))) (begin ¡ ¡ ¡ ¡ ¡ ¡(continue ¡(* ¡n ¡p))) ¡ ¡ ¡ ¡ ¡ ¡1)) ¡ ¡(define ¡(continuation ¡p ¡closure) ¡ ¡ ¡ ¡(if ¡(> ¡n ¡1) ¡ ¡(factorial ¡10)) ¡ ¡ ¡ ¡(let* ¡((n ¡(car ¡closure)) ¡ ¡ ¡ ¡ ¡ ¡(factorial ¡(-‑ ¡n ¡1) ¡continuation) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(continuation ¡(cadr ¡closure)) ¡ ¡ ¡ ¡ ¡ ¡(continue ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(nested-‑closure ¡(caddr ¡closure))) ¡ ¡(factorial ¡10 ¡display)) ¡ ¡ ¡ ¡ ¡ ¡(continuation ¡(* ¡n ¡p) ¡nested-‑closure))) ¡ ¡(define ¡(factorial ¡. ¡closure) ¡ ¡ ¡ ¡(define ¡n ¡(car ¡closure)) ¡ ¡ ¡ ¡(define ¡nested-‑continuation ¡(cadr ¡closure)) ¡ ¡ ¡ ¡(define ¡nested-‑closure ¡(caddr ¡closure)) ¡ ¡ ¡ ¡(if ¡(> ¡n ¡1) ¡ ¡ ¡ ¡ ¡ ¡(factorial ¡(-‑ ¡n ¡1) ¡continuation ¡closure) ¡ ¡ ¡ ¡ ¡ ¡(nested-‑continuation ¡1 ¡nested-‑closure))) ¡ ¡ ¡(define ¡(top-‑continuation ¡p ¡closure) ¡ ¡ ¡ ¡(display ¡p)) ¡ ¡(factorial ¡10 ¡top-‑continuation ¡'())) 56 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 56
Theo D’Hondt SLIP: a simple language implementation platform SLIP in C: continuations (cont'd) (begin (begin ¡ ¡(define ¡(factorial ¡n) ¡ ¡(define ¡(factorial ¡n ¡continue) ¡ ¡ ¡ ¡(if ¡(> ¡n ¡1) ¡ ¡ ¡ ¡(define ¡(continuation ¡p) ¡ ¡ ¡ ¡ ¡ ¡(* ¡n ¡(factorial ¡(-‑ ¡n ¡1))) (begin ¡ ¡ ¡ ¡ ¡ ¡(continue ¡(* ¡n ¡p))) ¡ ¡ ¡ ¡ ¡ ¡1)) ¡ ¡(define ¡(continuation ¡p ¡closure) ¡ ¡ ¡ ¡(if ¡(> ¡n ¡1) ¡ ¡(factorial ¡10)) ¡ ¡ ¡ ¡(let* ¡((n ¡(car ¡closure)) ¡ ¡ ¡ ¡ ¡ ¡(factorial ¡(-‑ ¡n ¡1) ¡continuation) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(continuation ¡(cadr ¡closure)) ¡ ¡ ¡ ¡ ¡ ¡(continue ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(nested-‑closure ¡(caddr ¡closure))) requires ad-hoc ¡ ¡(factorial ¡10 ¡display)) ¡ ¡ ¡ ¡ ¡ ¡(continuation ¡(* ¡n ¡p) ¡nested-‑closure))) ¡ ¡(define ¡(factorial ¡. ¡closure) closures ¡ ¡ ¡ ¡(define ¡n ¡(car ¡closure)) ¡ ¡ ¡ ¡(define ¡nested-‑continuation ¡(cadr ¡closure)) ¡ ¡ ¡ ¡(define ¡nested-‑closure ¡(caddr ¡closure)) ¡ ¡ ¡ ¡(if ¡(> ¡n ¡1) ¡ ¡ ¡ ¡ ¡ ¡(factorial ¡(-‑ ¡n ¡1) ¡continuation ¡closure) ¡ ¡ ¡ ¡ ¡ ¡(nested-‑continuation ¡1 ¡nested-‑closure))) ¡ ¡ ¡(define ¡(top-‑continuation ¡p ¡closure) ¡ ¡ ¡ ¡(display ¡p)) ¡ ¡(factorial ¡10 ¡top-‑continuation ¡'())) 57 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 57
Theo D’Hondt SLIP: a simple language implementation platform Ad hoc continuations in C #include ¡<stdio.h> #include ¡<stdlib.h> static ¡int ¡factorial(int ¡n) closure ¡ ¡{ ¡if ¡(n ¡> ¡1) ¡ ¡ ¡ ¡ ¡ ¡return ¡n ¡* ¡factorial(n ¡-‑ ¡1); number ¡ ¡ ¡ ¡else ¡ ¡ ¡ ¡ ¡ ¡return ¡1; ¡} continuation closure typedef ¡ ¡struct ¡cl ¡* ¡clos; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ typedef ¡ ¡ ¡void ¡(* ¡cont)(int, ¡clos); ¡ ¡ typedef ¡ ¡struct ¡cl ¡{ ¡int ¡n; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡cont ¡continuation; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡clos ¡closure; ¡} ¡cl; static ¡clos ¡make_closure(int ¡n, ¡cont ¡continuation, ¡clos ¡closure) ¡ ¡{ ¡clos ¡new_closure ¡= ¡malloc(sizeof(cl)); ¡ ¡ ¡ ¡new_closure-‑>n ¡= ¡n; ¡ ¡ ¡ ¡new_closure-‑>continuation ¡= ¡continuation; ¡ ¡ ¡ ¡new_closure-‑>closure ¡= ¡closure; ¡ ¡ ¡ ¡return ¡new_closure; ¡} 58 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 58
Theo D’Hondt SLIP: a simple language implementation platform Ad hoc continuations in C (cont'd) static ¡void ¡continuation(int ¡p, ¡clos ¡closure) ¡ ¡{ ¡int ¡n ¡= ¡closure-‑>n; ¡ ¡ ¡ ¡cont ¡continuation ¡= ¡closure-‑>continuation; ¡ ¡ ¡ ¡clos ¡nested_closure ¡= ¡closure-‑>closure; ¡ ¡ ¡ ¡free(closure); ¡ ¡ ¡ ¡continuation(n ¡* ¡p, ¡nested_closure); ¡} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ static ¡void ¡c_factorial(clos ¡closure) ¡ ¡{ ¡int ¡n ¡= ¡closure-‑>n; ¡ ¡ ¡ ¡cont ¡nested_continuation ¡= ¡closure-‑>continuation; ¡ ¡ ¡ ¡clos ¡nested_closure ¡= ¡closure-‑>closure; ¡ ¡ ¡ ¡if ¡(n ¡> ¡1) ¡ ¡ ¡ ¡ ¡ ¡c_factorial(make_closure(n ¡-‑ ¡1, ¡continuation, ¡closure)); ¡ ¡ ¡ ¡else ¡ ¡ ¡ ¡ ¡ ¡nested_continuation(1, ¡nested_closure); ¡} static ¡void ¡top_continuation(int ¡p, ¡clos ¡closure) ¡ ¡{ ¡printf("c_factorial(10) ¡= ¡%d\n", ¡p); ¡} int ¡main ¡(int ¡argc, ¡const ¡char ¡* ¡argv[]) ¡ ¡{ ¡printf("factorial(10) ¡ ¡ ¡= ¡%d\n", ¡factorial(10)); ¡ ¡ ¡ ¡c_factorial(make_closure(10, ¡top_continuation, ¡(clos)0)); ¡ ¡ ¡ ¡return ¡0; ¡} 59 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 59
Theo D’Hondt SLIP: a simple language implementation platform Ad hoc continuations in C (cont'd) static ¡void ¡continuation(int ¡p, ¡clos ¡closure) ¡ ¡{ ¡int ¡n ¡= ¡closure-‑>n; ¡ ¡ ¡ ¡cont ¡continuation ¡= ¡closure-‑>continuation; ¡ ¡ ¡ ¡clos ¡nested_closure ¡= ¡closure-‑>closure; ¡ ¡ ¡ ¡free(closure); ¡ ¡ ¡ ¡continuation(n ¡* ¡p, ¡nested_closure); ¡} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ static ¡void ¡c_factorial(clos ¡closure) ¡ ¡{ ¡int ¡n ¡= ¡closure-‑>n; ¡ ¡ ¡ ¡cont ¡nested_continuation ¡= ¡closure-‑>continuation; ¡ ¡ ¡ ¡clos ¡nested_closure ¡= ¡closure-‑>closure; ¡ ¡ ¡ ¡if ¡(n ¡> ¡1) ¡ ¡ ¡ ¡ ¡ ¡c_factorial(make_closure(n ¡-‑ ¡1, ¡continuation, ¡closure)); ¡ ¡ ¡ ¡else ¡ ¡ ¡ ¡ ¡ ¡nested_continuation(1, ¡nested_closure); ¡} static ¡void ¡top_continuation(int ¡p, ¡clos ¡closure) ¡ ¡{ ¡printf("c_factorial(10) ¡= ¡%d\n", ¡p); ¡} int ¡main ¡(int ¡argc, ¡const ¡char ¡* ¡argv[]) ¡ ¡{ ¡printf("factorial(10) ¡ ¡ ¡= ¡%d\n", ¡factorial(10)); ¡ ¡ ¡ ¡c_factorial(make_closure(10, ¡top_continuation, ¡(clos)0)); ¡ ¡ ¡ ¡return ¡0; ¡} 60 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 60
Theo D’Hondt SLIP: a simple language implementation platform Ad hoc continuations in C (cont'd) static ¡void ¡continuation(int ¡p, ¡clos ¡closure) ¡ ¡{ ¡int ¡n ¡= ¡closure-‑>n; ¡ ¡ ¡ ¡cont ¡continuation ¡= ¡closure-‑>continuation; ¡ ¡ ¡ ¡clos ¡nested_closure ¡= ¡closure-‑>closure; ¡ ¡ ¡ ¡free(closure); ¡ ¡ ¡ ¡continuation(n ¡* ¡p, ¡nested_closure); ¡} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ static ¡void ¡c_factorial(clos ¡closure) ¡ ¡{ ¡int ¡n ¡= ¡closure-‑>n; ¡ ¡ ¡ ¡cont ¡nested_continuation ¡= ¡closure-‑>continuation; ¡ ¡ ¡ ¡clos ¡nested_closure ¡= ¡closure-‑>closure; ¡ ¡ ¡ ¡if ¡(n ¡> ¡1) ¡ ¡ ¡ ¡ ¡ ¡c_factorial(make_closure(n ¡-‑ ¡1, ¡continuation, ¡closure)); ¡ ¡ ¡ ¡else ¡ ¡ ¡ ¡ ¡ ¡nested_continuation(1, ¡nested_closure); ¡} static ¡void ¡top_continuation(int ¡p, ¡clos ¡closure) ¡ ¡{ ¡printf("c_factorial(10) ¡= ¡%d\n", ¡p); ¡} int ¡main ¡(int ¡argc, ¡const ¡char ¡* ¡argv[]) ¡ ¡{ ¡printf("factorial(10) ¡ ¡ ¡= ¡%d\n", ¡factorial(10)); ¡ ¡ ¡ ¡c_factorial(make_closure(10, ¡top_continuation, ¡(clos)0)); ¡ ¡ ¡ ¡return ¡0; ¡} 61 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 61
Theo D’Hondt SLIP: a simple language implementation platform Incremental SLIP implementation in C version 1: straightforward code version 2: using a trampoline version 3: factored out environment version 4: threaded continuations version 5: functional continuations version 6: partial evaluation version 7: iterative constructs version 8: lexical addressing version 9: garbage collection version 10: proper tail recursion version 11: 1st class continuations version 12: smart caching version 13: multicores 62 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 62
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C client interface ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡/*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡/* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡>>>Slip<<< ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡/* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Theo ¡D'Hondt ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡/* ¡ ¡ ¡ ¡ ¡VUB ¡Software ¡Languages ¡Lab ¡ ¡ ¡ ¡*/ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡/* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(c) ¡2010 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡/*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡/* ¡ ¡version ¡1: ¡straightforward ¡code ¡ ¡*/ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡/*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡/* ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Slip ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡*/ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡/*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑ ¡imported ¡functions ¡-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ void ¡Slip_Load(char ¡ ¡*, ¡char ¡**); void ¡Slip_Print(char ¡ ¡*); void ¡Slip_Read(char ¡**); /*-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑ ¡exported ¡functions ¡-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑-‑*/ void ¡Slip_REP(char ¡ ¡*, ¡int ¡ ¡ ¡ ¡); 63 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 63
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C example 64 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 64
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C ultimate implementation client ! ! scan pool main print thread stack read grammar evaluate context dictionary compile memory native environment 65 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 65
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C initial implementation client ! ! scan pool main print read grammar evaluate dictionary memory native 66 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 66
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C initial implementation (cont'd) client ! ! scan pool main print read grammar evaluate dictionary memory native 67 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 67
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C initial implementation (cont'd) client ! 347 + 37 loc 58 + 15 loc 179 + 66 loc ! 214 + 17 loc scan pool main print 1435 + 24 loc read grammar evaluate 198 + 15 loc 296 + 171 loc 63 + 26 loc dictionary memory native x + y loc 2071 + 14 loc 5347 loc 68 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 68
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C first stage client ! ! scan pool main print read grammar evaluate dictionary memory native version 1: straightforward cps implementation 69 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 69
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C first stage (cont'd) client ! ! scan pool main print read grammar evaluate dictionary memory native version 2: introducing a trampoline 70 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 70
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C first stage (cont'd) client ! ! scan pool main print read grammar evaluate dictionary memory native version 3: factored out environment 71 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 71
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C second stage client ! ! scan pool main print thread read grammar evaluate dictionary memory native version 4: threaded continuations 72 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 72
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C second stage (cont'd) client ! ! scan pool main print thread read grammar evaluate dictionary memory native version 5: functional continuations 73 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 73
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C third stage client ! ! scan pool main print thread read grammar evaluate dictionary compile memory native version 6: partial evaluation 74 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 74
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C third stage (cont'd) client ! ! scan pool main print thread read grammar evaluate dictionary compile memory native version 7: iterative constructs 75 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 75
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C fourth stage client ! ! scan pool main print thread read grammar evaluate dictionary compile memory native environment version 8: lexical addressing 76 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 76
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C fifth stage client ! ! scan pool main print thread stack read grammar evaluate dictionary compile memory native environment version 9: garbage collection 77 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 77
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C fifth stage (cont'd) client ! ! scan pool main print thread stack read grammar evaluate dictionary compile memory native environment version 10: proper tail recursion 78 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 78
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C fifth stage (cont'd) client ! ! scan pool main print thread stack read grammar evaluate dictionary compile memory native environment version 11: first class continuations 79 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 79
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C fifth stage (cont'd) client ! ! scan pool main print thread stack read grammar evaluate dictionary compile memory native environment version 12: smart caches 80 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 80
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C new stage client ! ! scan pool main print thread stack read grammar evaluate context dictionary compile memory native environment version 13: multicore support 81 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 81
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C implementation size 90,0 67,5 45,0 10000 22,5 7500 0 1 2 3 4 5 6 7 8 9 10 11 12 13 code size (kb) 5000 2500 0 1 2 3 4 5 6 7 8 9 10 11 12 13 source size (loc) 82 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 82
Theo D’Hondt SLIP: a simple language implementation platform Multicore memory management BYT_type ¡Memory_Claim(UNS_type ¡Claim) ¡ ¡{ ¡BYT_type ¡overflow; ¡ ¡ ¡ ¡Slip_Spin_Lock(Memory_lock); ¡ ¡ ¡ ¡Claim_size ¡+= ¡Claim ¡+ ¡1; ¡ ¡ ¡ ¡Claim_counter++; ¡ ¡ ¡ ¡overflow ¡= ¡(Tail_pointer ¡-‑ ¡Free_pointer ¡<= ¡Claim_size); ¡ ¡ ¡ ¡ if ¡(overflow) ¡ ¡ ¡ ¡ ¡ ¡{ ¡collect(); ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ if ¡(Tail_pointer ¡-‑ ¡Free_pointer ¡<= ¡Claim_size) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Memory_Fail(); ¡} ¡ ¡ ¡ ¡Slip_Spin_Unlock(Memory_lock); PTR_type ¡Memory_Make_Chunk(BYT_type ¡Tag, ¡ ¡ ¡ ¡ return ¡overflow; ¡} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡UNS_type ¡Size) ¡ ¡{ ¡PTR_type ¡pointer; ¡ ¡ ¡ ¡UNS_type ¡size; ¡ ¡ ¡ ¡size ¡= ¡Size ¡+ ¡1; ¡ ¡ ¡ ¡Slip_Spin_Lock(Memory_lock); ¡ ¡ ¡ ¡ if ¡(size ¡> ¡Claim_size) ¡ ¡ ¡ ¡ ¡ ¡Memory_Fail(); ¡ ¡ ¡ ¡pointer ¡= ¡Free_pointer; ¡ ¡ ¡ ¡Free_pointer ¡+= ¡size; ¡ ¡ ¡ ¡Slip_Spin_Unlock(Memory_lock); ¡ ¡ ¡ ¡pointer-‑>cel ¡= ¡make_header(Tag, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Size); NIL_type ¡Memory_Release(UNS_type ¡Claim) ¡ ¡ ¡ ¡ return ¡pointer; ¡} ¡ ¡{ ¡Slip_Spin_Lock(Memory_lock); ¡ ¡ ¡ ¡Claim_size ¡-‑= ¡Claim ¡+ ¡1; ¡ ¡ ¡ ¡Claim_counter-‑-‑; ¡ ¡ ¡ ¡Slip_Spin_Unlock(Memory_lock); ¡} 83 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 83
Theo D’Hondt SLIP: a simple language implementation platform Multicore memory management BYT_type ¡Memory_Claim(UNS_type ¡Claim) ¡ ¡{ ¡BYT_type ¡overflow; ¡ ¡ ¡ ¡Slip_Spin_Lock(Memory_lock); ¡ ¡ ¡ ¡Claim_size ¡+= ¡Claim ¡+ ¡1; ¡ ¡ ¡ ¡Claim_counter++; ¡ ¡ ¡ ¡overflow ¡= ¡(Tail_pointer ¡-‑ ¡Free_pointer ¡<= ¡Claim_size); ¡ ¡ ¡ ¡ if ¡(overflow) ¡ ¡ ¡ ¡ ¡ ¡{ ¡collect(); ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ if ¡(Tail_pointer ¡-‑ ¡Free_pointer ¡<= ¡Claim_size) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Memory_Fail(); ¡} ¡ ¡ ¡ ¡Slip_Spin_Unlock(Memory_lock); PTR_type ¡Memory_Make_Chunk(BYT_type ¡Tag, ¡ ¡ ¡ ¡ return ¡overflow; ¡} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡UNS_type ¡Size) ¡ ¡{ ¡PTR_type ¡pointer; ¡ ¡ ¡ ¡UNS_type ¡size; ¡ ¡ ¡ ¡size ¡= ¡Size ¡+ ¡1; ¡ ¡ ¡ ¡Slip_Spin_Lock(Memory_lock); ¡ ¡ ¡ ¡ if ¡(size ¡> ¡Claim_size) ¡ ¡ ¡ ¡ ¡ ¡Memory_Fail(); ¡ ¡ ¡ ¡pointer ¡= ¡Free_pointer; ¡ ¡ ¡ ¡Free_pointer ¡+= ¡size; ¡ ¡ ¡ ¡Slip_Spin_Unlock(Memory_lock); ¡ ¡ ¡ ¡pointer-‑>cel ¡= ¡make_header(Tag, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Size); NIL_type ¡Memory_Release(UNS_type ¡Claim) ¡ ¡ ¡ ¡ return ¡pointer; ¡} ¡ ¡{ ¡Slip_Spin_Lock(Memory_lock); ¡ ¡ ¡ ¡Claim_size ¡-‑= ¡Claim ¡+ ¡1; ¡ ¡ ¡ ¡Claim_counter-‑-‑; ¡ ¡ ¡ ¡Slip_Spin_Unlock(Memory_lock); ¡} 84 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 84
Theo D’Hondt SLIP: a simple language implementation platform Multicore memory management BYT_type ¡Memory_Claim(UNS_type ¡Claim) ¡ ¡{ ¡BYT_type ¡overflow; ¡ ¡ ¡ ¡Slip_Spin_Lock(Memory_lock); ¡ ¡ ¡ ¡Claim_size ¡+= ¡Claim ¡+ ¡1; ¡ ¡ ¡ ¡Claim_counter++; ¡ ¡ ¡ ¡overflow ¡= ¡(Tail_pointer ¡-‑ ¡Free_pointer ¡<= ¡Claim_size); ¡ ¡ ¡ ¡ if ¡(overflow) ¡ ¡ ¡ ¡ ¡ ¡{ ¡collect(); ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ if ¡(Tail_pointer ¡-‑ ¡Free_pointer ¡<= ¡Claim_size) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Memory_Fail(); ¡} ¡ ¡ ¡ ¡Slip_Spin_Unlock(Memory_lock); PTR_type ¡Memory_Make_Chunk(BYT_type ¡Tag, ¡ ¡ ¡ ¡ return ¡overflow; ¡} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡UNS_type ¡Size) ¡ ¡{ ¡PTR_type ¡pointer; ¡ ¡ ¡ ¡UNS_type ¡size; ¡ ¡ ¡ ¡size ¡= ¡Size ¡+ ¡1; ¡ ¡ ¡ ¡Slip_Spin_Lock(Memory_lock); ¡ ¡ ¡ ¡ if ¡(size ¡> ¡Claim_size) ¡ ¡ ¡ ¡ ¡ ¡Memory_Fail(); ¡ ¡ ¡ ¡pointer ¡= ¡Free_pointer; ¡ ¡ ¡ ¡Free_pointer ¡+= ¡size; ¡ ¡ ¡ ¡Slip_Spin_Unlock(Memory_lock); ¡ ¡ ¡ ¡pointer-‑>cel ¡= ¡make_header(Tag, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Size); NIL_type ¡Memory_Release(UNS_type ¡Claim) ¡ ¡ ¡ ¡ return ¡pointer; ¡} ¡ ¡{ ¡Slip_Spin_Lock(Memory_lock); ¡ ¡ ¡ ¡Claim_size ¡-‑= ¡Claim ¡+ ¡1; ¡ ¡ ¡ ¡Claim_counter-‑-‑; ¡ ¡ ¡ ¡Slip_Spin_Unlock(Memory_lock); ¡} 85 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 85
Theo D’Hondt SLIP: a simple language implementation platform Multicore memory management BYT_type ¡Memory_Claim(UNS_type ¡Claim) ¡ ¡{ ¡BYT_type ¡overflow; ¡ ¡ ¡ ¡Slip_Spin_Lock(Memory_lock); ¡ ¡ ¡ ¡Claim_size ¡+= ¡Claim ¡+ ¡1; ¡ ¡ ¡ ¡Claim_counter++; ¡ ¡ ¡ ¡overflow ¡= ¡(Tail_pointer ¡-‑ ¡Free_pointer ¡<= ¡Claim_size); ¡ ¡ ¡ ¡ if ¡(overflow) ¡ ¡ ¡ ¡ ¡ ¡{ ¡collect(); ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ if ¡(Tail_pointer ¡-‑ ¡Free_pointer ¡<= ¡Claim_size) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Memory_Fail(); ¡} ¡ ¡ ¡ ¡Slip_Spin_Unlock(Memory_lock); PTR_type ¡Memory_Make_Chunk(BYT_type ¡Tag, ¡ ¡ ¡ ¡ return ¡overflow; ¡} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡UNS_type ¡Size) ¡ ¡{ ¡PTR_type ¡pointer; ¡ ¡ ¡ ¡UNS_type ¡size; ¡ ¡ ¡ ¡size ¡= ¡Size ¡+ ¡1; ¡ ¡ ¡ ¡Slip_Spin_Lock(Memory_lock); ¡ ¡ ¡ ¡ if ¡(size ¡> ¡Claim_size) ¡ ¡ ¡ ¡ ¡ ¡Memory_Fail(); ¡ ¡ ¡ ¡pointer ¡= ¡Free_pointer; ¡ ¡ ¡ ¡Free_pointer ¡+= ¡size; ¡ ¡ ¡ ¡Slip_Spin_Unlock(Memory_lock); ¡ ¡ ¡ ¡pointer-‑>cel ¡= ¡make_header(Tag, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Size); NIL_type ¡Memory_Release(UNS_type ¡Claim) ¡ ¡ ¡ ¡ return ¡pointer; ¡} ¡ ¡{ ¡Slip_Spin_Lock(Memory_lock); ¡ ¡ ¡ ¡Claim_size ¡-‑= ¡Claim ¡+ ¡1; ¡ ¡ ¡ ¡Claim_counter-‑-‑; ¡ ¡ ¡ ¡Slip_Spin_Unlock(Memory_lock); ¡} 86 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 86
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C multicore quicksort ¡ ¡(define ¡(Sort ¡V ¡Low ¡High ¡Recurse) ¡ ¡ ¡ ¡(define ¡Left ¡Low) ¡ ¡ ¡ ¡(define ¡Right ¡High) ¡ ¡ ¡ ¡(define ¡Pivot ¡(vector-‑ref ¡V ¡(quotient ¡(+ ¡Left ¡Right) ¡2))) ¡ ¡ ¡ ¡(define ¡Save ¡0) ¡ ¡(define ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(while ¡(< ¡Left ¡Right) ¡ ¡ ¡ ¡(define ¡(SingleCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(< ¡(vector-‑ref ¡V ¡Left) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(> ¡(vector-‑ref ¡V ¡Right) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Left ¡High))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(<= ¡Left ¡Right) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡SingleCore-‑Recurse)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Save ¡(vector-‑ref ¡V ¡Left)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Left ¡(vector-‑ref ¡V ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Right ¡Save) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))))) ¡ ¡(define ¡(MultiCore-‑QuickSort ¡Depth ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(Recurse ¡Left ¡Right)) ¡ ¡ ¡ ¡(define ¡(MultiCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡Depth ¡0) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡promise ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(spawn ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Low ¡Right)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Left ¡High)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(sync ¡promise)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡MultiCore-‑Recurse)) 87 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 87
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C multicore quicksort (cont'd) ¡ ¡(define ¡(Sort ¡V ¡Low ¡High ¡Recurse) ¡ ¡ ¡ ¡(define ¡Left ¡Low) ¡ ¡ ¡ ¡(define ¡Right ¡High) ¡ ¡ ¡ ¡(define ¡Pivot ¡(vector-‑ref ¡V ¡(quotient ¡(+ ¡Left ¡Right) ¡2))) ¡ ¡ ¡ ¡(define ¡Save ¡0) ¡ ¡(define ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(while ¡(< ¡Left ¡Right) ¡ ¡ ¡ ¡(define ¡(SingleCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(< ¡(vector-‑ref ¡V ¡Left) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(> ¡(vector-‑ref ¡V ¡Right) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Left ¡High))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(<= ¡Left ¡Right) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡SingleCore-‑Recurse)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Save ¡(vector-‑ref ¡V ¡Left)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Left ¡(vector-‑ref ¡V ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Right ¡Save) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))))) ¡ ¡(define ¡(MultiCore-‑QuickSort ¡Depth ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(Recurse ¡Left ¡Right)) ¡ ¡ ¡ ¡(define ¡(MultiCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡Depth ¡0) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡promise ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(spawn ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Low ¡Right)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Left ¡High)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(sync ¡promise)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡MultiCore-‑Recurse)) 88 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 88
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C multicore quicksort (cont'd) ¡ ¡(define ¡(Sort ¡V ¡Low ¡High ¡Recurse) ¡ ¡ ¡ ¡(define ¡Left ¡Low) ¡ ¡ ¡ ¡(define ¡Right ¡High) ¡ ¡ ¡ ¡(define ¡Pivot ¡(vector-‑ref ¡V ¡(quotient ¡(+ ¡Left ¡Right) ¡2))) ¡ ¡ ¡ ¡(define ¡Save ¡0) ¡ ¡(define ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(while ¡(< ¡Left ¡Right) ¡ ¡ ¡ ¡(define ¡(SingleCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(< ¡(vector-‑ref ¡V ¡Left) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(> ¡(vector-‑ref ¡V ¡Right) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Left ¡High))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(<= ¡Left ¡Right) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡SingleCore-‑Recurse)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Save ¡(vector-‑ref ¡V ¡Left)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Left ¡(vector-‑ref ¡V ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Right ¡Save) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))))) ¡ ¡(define ¡(MultiCore-‑QuickSort ¡Depth ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(Recurse ¡Left ¡Right)) ¡ ¡ ¡ ¡(define ¡(MultiCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡Depth ¡0) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡promise ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(spawn ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Low ¡Right)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Left ¡High)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(sync ¡promise)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡MultiCore-‑Recurse)) 89 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 89
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C multicore quicksort (cont'd) ¡ ¡(define ¡(Sort ¡V ¡Low ¡High ¡Recurse) ¡ ¡ ¡ ¡(define ¡Left ¡Low) ¡ ¡ ¡ ¡(define ¡Right ¡High) ¡ ¡ ¡ ¡(define ¡Pivot ¡(vector-‑ref ¡V ¡(quotient ¡(+ ¡Left ¡Right) ¡2))) ¡ ¡ ¡ ¡(define ¡Save ¡0) ¡ ¡(define ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(while ¡(< ¡Left ¡Right) ¡ ¡ ¡ ¡(define ¡(SingleCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(< ¡(vector-‑ref ¡V ¡Left) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(> ¡(vector-‑ref ¡V ¡Right) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Left ¡High))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(<= ¡Left ¡Right) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡SingleCore-‑Recurse)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Save ¡(vector-‑ref ¡V ¡Left)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Left ¡(vector-‑ref ¡V ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Right ¡Save) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))))) ¡ ¡(define ¡(MultiCore-‑QuickSort ¡Depth ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(Recurse ¡Left ¡Right)) ¡ ¡ ¡ ¡(define ¡(MultiCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡Depth ¡0) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡promise ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(spawn ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Low ¡Right)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Left ¡High)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(sync ¡promise)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡MultiCore-‑Recurse)) 90 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 90
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C multicore quicksort (cont'd) ¡ ¡(define ¡(Sort ¡V ¡Low ¡High ¡Recurse) ¡ ¡ ¡ ¡(define ¡Left ¡Low) ¡ ¡ ¡ ¡(define ¡Right ¡High) ¡ ¡ ¡ ¡(define ¡Pivot ¡(vector-‑ref ¡V ¡(quotient ¡(+ ¡Left ¡Right) ¡2))) ¡ ¡ ¡ ¡(define ¡Save ¡0) ¡ ¡(define ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(while ¡(< ¡Left ¡Right) ¡ ¡ ¡ ¡(define ¡(SingleCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(< ¡(vector-‑ref ¡V ¡Left) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(> ¡(vector-‑ref ¡V ¡Right) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Left ¡High))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(<= ¡Left ¡Right) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡SingleCore-‑Recurse)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Save ¡(vector-‑ref ¡V ¡Left)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Left ¡(vector-‑ref ¡V ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Right ¡Save) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))))) ¡ ¡(define ¡(MultiCore-‑QuickSort ¡Depth ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(Recurse ¡Left ¡Right)) ¡ ¡ ¡ ¡(define ¡(MultiCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡Depth ¡0) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡promise ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(spawn ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Low ¡Right)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Left ¡High)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(sync ¡promise)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡MultiCore-‑Recurse)) 91 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 91
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C multicore quicksort (cont'd) ¡ ¡(define ¡(Sort ¡V ¡Low ¡High ¡Recurse) ¡ ¡ ¡ ¡(define ¡Left ¡Low) ¡ ¡ ¡ ¡(define ¡Right ¡High) ¡ ¡ ¡ ¡(define ¡Pivot ¡(vector-‑ref ¡V ¡(quotient ¡(+ ¡Left ¡Right) ¡2))) ¡ ¡ ¡ ¡(define ¡Save ¡0) ¡ ¡(define ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(while ¡(< ¡Left ¡Right) ¡ ¡ ¡ ¡(define ¡(SingleCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(< ¡(vector-‑ref ¡V ¡Left) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(> ¡(vector-‑ref ¡V ¡Right) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Left ¡High))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(<= ¡Left ¡Right) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡SingleCore-‑Recurse)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Save ¡(vector-‑ref ¡V ¡Left)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Left ¡(vector-‑ref ¡V ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Right ¡Save) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))))) ¡ ¡(define ¡(MultiCore-‑QuickSort ¡Depth ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(Recurse ¡Left ¡Right)) ¡ ¡ ¡ ¡(define ¡(MultiCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡Depth ¡0) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡promise ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(spawn ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Low ¡Right)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Left ¡High)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(sync ¡promise)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡MultiCore-‑Recurse)) 92 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 92
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C multicore quicksort (cont'd) ¡ ¡(define ¡(Sort ¡V ¡Low ¡High ¡Recurse) ¡ ¡ ¡ ¡(define ¡Left ¡Low) ¡ ¡ ¡ ¡(define ¡Right ¡High) ¡ ¡ ¡ ¡(define ¡Pivot ¡(vector-‑ref ¡V ¡(quotient ¡(+ ¡Left ¡Right) ¡2))) ¡ ¡ ¡ ¡(define ¡Save ¡0) ¡ ¡(define ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(while ¡(< ¡Left ¡Right) ¡ ¡ ¡ ¡(define ¡(SingleCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(< ¡(vector-‑ref ¡V ¡Left) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(> ¡(vector-‑ref ¡V ¡Right) ¡Pivot) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Left ¡High))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(<= ¡Left ¡Right) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡SingleCore-‑Recurse)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Save ¡(vector-‑ref ¡V ¡Left)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Left ¡(vector-‑ref ¡V ¡Right)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡Right ¡Save) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Left ¡(+ ¡Left ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡Right ¡(-‑ ¡Right ¡1))))) ¡ ¡(define ¡(MultiCore-‑QuickSort ¡Depth ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(Recurse ¡Left ¡Right)) ¡ ¡ ¡ ¡(define ¡(MultiCore-‑Recurse ¡Left ¡Right) ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡Depth ¡0) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(begin ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡promise ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(< ¡Low ¡Right) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(spawn ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Low ¡Right)))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡High ¡Left) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(MultiCore-‑QuickSort ¡(-‑ ¡Depth ¡1) ¡V ¡Left ¡High)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(sync ¡promise)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(SingleCore-‑QuickSort ¡V ¡Low ¡High))) ¡ ¡ ¡ ¡(Sort ¡V ¡Low ¡High ¡MultiCore-‑Recurse)) 93 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 93
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C multicore quicksort (cont'd) (define ¡size ¡1000000) ¡ ¡(define ¡V ¡(make-‑vector ¡size ¡0)) ¡ ¡(define ¡Low ¡0) ¡ ¡(define ¡High ¡(-‑ ¡(vector-‑length ¡V) ¡1)) ¡ ¡(define ¡depth ¡0) ¡ ¡(define ¡threads ¡1) ¡ ¡(display ¡"multicore ¡quicksort ¡of ¡") ¡ ¡(display ¡size) ¡ ¡(display ¡" ¡integers") ¡ ¡(newline) ¡ ¡(while ¡(< ¡depth ¡2) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(display ¡"number ¡of ¡threads ¡= ¡") ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(display ¡threads) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡x ¡0) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡y ¡1) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(<= ¡x ¡High) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡x ¡y) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡x ¡(+ ¡x ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡y ¡(remainder ¡(+ ¡y ¡4253171) ¡1235711))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡t ¡(clock)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(MultiCore-‑QuickSort ¡depth ¡V ¡Low ¡High) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(display ¡" ¡ ¡elapsed ¡time ¡= ¡") ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(display ¡(-‑ ¡(clock) ¡t)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(display ¡" ¡secs") ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡depth ¡(+ ¡depth ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡threads ¡(* ¡threads ¡2)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(newline))) 94 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 94
Theo D’Hondt SLIP: a simple language implementation platform SLIP/C multicore quicksort (cont'd) (define ¡size ¡1000000) ¡ ¡(define ¡V ¡(make-‑vector ¡size ¡0)) ¡ ¡(define ¡Low ¡0) ¡ ¡(define ¡High ¡(-‑ ¡(vector-‑length ¡V) ¡1)) ¡ ¡(define ¡depth ¡0) ¡ ¡(define ¡(report ¡text ¡c) ¡ ¡(define ¡threads ¡1) ¡ ¡ ¡ ¡(protect ¡ ¡(display ¡"multicore ¡quicksort ¡of ¡") ¡ ¡ ¡ ¡ ¡(display ¡text) ¡ ¡(display ¡size) ¡ ¡ ¡ ¡ ¡(display ¡c) ¡ ¡(display ¡" ¡integers") ¡ ¡ ¡ ¡ ¡(display ¡" ¡") ¡ ¡(newline) ¡ ¡ ¡ ¡ ¡(display ¡" ¡... ¡") ¡ ¡(while ¡(< ¡depth ¡2) ¡ ¡ ¡ ¡ ¡(display ¡(-‑ ¡(clock) ¡t)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(display ¡"number ¡of ¡threads ¡= ¡") ¡ ¡ ¡ ¡ ¡(display ¡" ¡secs") ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(display ¡threads) ¡ ¡ ¡ ¡ ¡(newline))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡x ¡0) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡y ¡1) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(while ¡(<= ¡x ¡High) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(vector-‑set! ¡V ¡x ¡y) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡x ¡(+ ¡x ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡y ¡(remainder ¡(+ ¡y ¡4253171) ¡1235711))) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(define ¡t ¡(clock)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(MultiCore-‑QuickSort ¡depth ¡V ¡Low ¡High) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(display ¡" ¡ ¡elapsed ¡time ¡= ¡") ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(display ¡(-‑ ¡(clock) ¡t)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(display ¡" ¡secs") ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡depth ¡(+ ¡depth ¡1)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(set! ¡threads ¡(* ¡threads ¡2)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(newline))) 95 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 95
Theo D’Hondt SLIP: a simple language implementation platform Multicore quicksort on a 4core MacPro 4core 96 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 96
Theo D’Hondt SLIP: a simple language implementation platform Multicore quicksort on a 4core (cont'd) 97 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 97
Theo D’Hondt SLIP: a simple language implementation platform Multicore quicksort on a 4core (cont'd) 16 13 11 8 7 6 98 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 98
Theo D’Hondt SLIP: a simple language implementation platform Multicore quicksort on a 4core (cont'd) clock vs. time in <time.h> 16 13 11 8 7 6 99 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 99
Theo D’Hondt SLIP: a simple language implementation platform Multicore quicksort on a 4core (cont'd) ¡ ¡(define ¡(median-‑of-‑3 ¡V ¡Low ¡High) ¡ ¡ ¡ ¡(define ¡(random-‑index) ¡ ¡ ¡ ¡ ¡ ¡(+ ¡Low ¡(remainder ¡(random) ¡(-‑ ¡High ¡Low ¡-‑1)))) ¡ ¡ ¡ ¡(define ¡first ¡ ¡(vector-‑ref ¡V ¡(random-‑index))) ¡ ¡ ¡ ¡(define ¡second ¡(vector-‑ref ¡V ¡(random-‑index))) ¡ ¡ ¡ ¡(define ¡third ¡ ¡(vector-‑ref ¡V ¡(random-‑index))) ¡ ¡ ¡ ¡(if ¡(> ¡first ¡second) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡second ¡third) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡second ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡first ¡third) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡first ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡third)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡first ¡third) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡first ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡(if ¡(> ¡second ¡third) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡second ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡third)))) clock vs. time in <time.h> 16 13 11 8 7 6 100 SOFT Research Presentation November 9th, 2010 Wednesday 9 March 2011 100
Recommend
More recommend