diff options
Diffstat (limited to 'awk/scheme/scheme/docs/scheme-compilation-examples.md')
-rw-r--r-- | awk/scheme/scheme/docs/scheme-compilation-examples.md | 222 |
1 files changed, 0 insertions, 222 deletions
diff --git a/awk/scheme/scheme/docs/scheme-compilation-examples.md b/awk/scheme/scheme/docs/scheme-compilation-examples.md deleted file mode 100644 index 43bae3a..0000000 --- a/awk/scheme/scheme/docs/scheme-compilation-examples.md +++ /dev/null @@ -1,222 +0,0 @@ -# Scheme to VM Instruction Examples - -## Basic Arithmetic - -### Simple Addition -```scheme -(+ 1 2) -``` -```awk -# VM Instructions -0 PUSH_CONST N:1 -1 PUSH_CONST N:2 -2 ADD -``` - -### Nested Arithmetic -```scheme -(+ (* 3 4) (- 10 5)) -``` -```awk -# VM Instructions -0 PUSH_CONST N:3 -1 PUSH_CONST N:4 -2 MUL # Stack now has 12 -3 PUSH_CONST N:10 -4 PUSH_CONST N:5 -5 SUB # Stack now has 5 -6 ADD # Final result 17 -``` - -## Variable Binding and Use - -### Let Expression -```scheme -(let ((x 5)) - (+ x 1)) -``` -```awk -# VM Instructions -0 MAKE_ENV 1 # Create environment with 1 slot -1 PUSH_CONST N:5 # Push initial value -2 STORE_LOCAL 0 # Store into x's slot -3 LOAD_LOCAL 0 # Load x -4 PUSH_CONST N:1 -5 ADD -``` - -### Nested Let -```scheme -(let ((x 5)) - (let ((y (+ x 1))) - (* x y))) -``` -```awk -# VM Instructions -0 MAKE_ENV 1 # Environment for x -1 PUSH_CONST N:5 -2 STORE_LOCAL 0 # Store x -3 MAKE_ENV 1 # Environment for y -4 LOAD_LOCAL 0 # Load x -5 PUSH_CONST N:1 -6 ADD -7 STORE_LOCAL 0 # Store y -8 LOAD_LOCAL 1 # Load x (from outer env) -9 LOAD_LOCAL 0 # Load y -10 MUL -``` - -## Function Definition and Call - -### Simple Function -```scheme -(define (add1 x) - (+ x 1)) -``` -```awk -# VM Instructions -0 MAKE_FUNCTION 2 # Create function pointing to instruction 2 -1 STORE_GLOBAL 0 # Store in global env slot for add1 -2 MAKE_ENV 1 # Function body starts here -3 LOAD_LOCAL 0 # Load parameter x -4 PUSH_CONST N:1 -5 ADD -6 RETURN -``` - -### Function Call -```scheme -(add1 5) -``` -```awk -# VM Instructions -0 PUSH_CONST N:5 # Push argument -1 LOAD_GLOBAL 0 # Load add1 function -2 CALL 1 # Call with 1 argument -``` - -## List Operations - -### List Construction -```scheme -(cons 1 (cons 2 '())) -``` -```awk -# VM Instructions -0 PUSH_CONST N:1 -1 PUSH_CONST N:2 -2 PUSH_CONST NIL: -3 CONS # Creates (2 . nil) -4 CONS # Creates (1 . (2 . nil)) -``` - -### List Operations -```scheme -(car (cons 1 2)) -``` -```awk -# VM Instructions -0 PUSH_CONST N:1 -1 PUSH_CONST N:2 -2 CONS -3 CAR -``` - -## Conditionals - -### If Expression -```scheme -(if (< x 0) - (- 0 x) - x) -``` -```awk -# VM Instructions -0 LOAD_LOCAL 0 # Load x -1 PUSH_CONST N:0 -2 NUM_LT # Compare x < 0 -3 JUMP_IF_FALSE 7 # Skip to else branch if false -4 PUSH_CONST N:0 -5 LOAD_LOCAL 0 # Load x again -6 SUB # Compute 0 - x -7 JUMP 9 # Skip else branch -8 LOAD_LOCAL 0 # Else branch: just load x -9 NOP # Continue here -``` - -## Closures - -### Create Closure -```scheme -(let ((x 1)) - (lambda (y) (+ x y))) -``` -```awk -# VM Instructions -0 MAKE_ENV 1 # Environment for x -1 PUSH_CONST N:1 -2 STORE_LOCAL 0 # Store x -3 MAKE_FUNCTION 5 # Create function -4 MAKE_CLOSURE 1 # Capture current env -5 MAKE_ENV 1 # Function body starts here -6 LOAD_FREE 0 # Load captured x -7 LOAD_LOCAL 0 # Load parameter y -8 ADD -9 RETURN -``` - -## Recursive Function - -### Factorial -```scheme -(define (factorial n) - (if (= n 0) - 1 - (* n (factorial (- n 1))))) -``` -```awk -# VM Instructions -0 MAKE_FUNCTION 2 # Create factorial function -1 STORE_GLOBAL 0 # Store in global env -2 MAKE_ENV 1 # Function body starts -3 LOAD_LOCAL 0 # Load n -4 PUSH_CONST N:0 -5 NUM_EQ # Compare n = 0 -6 JUMP_IF_FALSE 9 # Skip to else branch -7 PUSH_CONST N:1 # Return 1 for base case -8 RETURN -9 LOAD_LOCAL 0 # Load n -10 LOAD_LOCAL 0 # Load n again -11 PUSH_CONST N:1 -12 SUB # Compute n - 1 -13 LOAD_GLOBAL 0 # Load factorial function -14 TAIL_CALL 1 # Tail call factorial(n-1) -15 MUL # Multiply n * factorial(n-1) -16 RETURN -``` - -## Implementation Notes - -1. Environment Chain -- Each MAKE_ENV creates a new frame -- LOAD_LOCAL counts down the chain for outer references -- STORE_LOCAL works similarly - -2. Closure Creation -- MAKE_CLOSURE captures current environment -- LOAD_FREE accesses captured variables - -3. Tail Calls -- TAIL_CALL reuses current stack frame -- Essential for recursive functions - -4. Memory Management -- CONS allocates in heap -- Reference counting needed for heap objects -- Environment frames need reference counting too - -These examples show typical compilation patterns. The actual compiler would need to: -1. Track variable locations -2. Manage label generation -3. Detect tail call positions -4. Handle lexical scoping properly |