diff --git a/Programming Languages/Part B/100_memoization.rkt b/Programming Languages/Part B/Week 1/100_memoization.rkt similarity index 100% rename from Programming Languages/Part B/100_memoization.rkt rename to Programming Languages/Part B/Week 1/100_memoization.rkt diff --git a/Programming Languages/Part B/101_macros_intro.rkt b/Programming Languages/Part B/Week 1/101_macros_intro.rkt similarity index 100% rename from Programming Languages/Part B/101_macros_intro.rkt rename to Programming Languages/Part B/Week 1/101_macros_intro.rkt diff --git a/Programming Languages/Part B/103_define_syntax.rkt b/Programming Languages/Part B/Week 1/103_define_syntax.rkt similarity index 100% rename from Programming Languages/Part B/103_define_syntax.rkt rename to Programming Languages/Part B/Week 1/103_define_syntax.rkt diff --git a/Programming Languages/Part B/105_macro_examples.rkt b/Programming Languages/Part B/Week 1/105_macro_examples.rkt similarity index 100% rename from Programming Languages/Part B/105_macro_examples.rkt rename to Programming Languages/Part B/Week 1/105_macro_examples.rkt diff --git a/Programming Languages/Part B/83_racket_intro.rkt b/Programming Languages/Part B/Week 1/83_racket_intro.rkt similarity index 100% rename from Programming Languages/Part B/83_racket_intro.rkt rename to Programming Languages/Part B/Week 1/83_racket_intro.rkt diff --git a/Programming Languages/Part B/84_racket_basics.rkt b/Programming Languages/Part B/Week 1/84_racket_basics.rkt similarity index 100% rename from Programming Languages/Part B/84_racket_basics.rkt rename to Programming Languages/Part B/Week 1/84_racket_basics.rkt diff --git a/Programming Languages/Part B/85_racket_lists.rkt b/Programming Languages/Part B/Week 1/85_racket_lists.rkt similarity index 100% rename from Programming Languages/Part B/85_racket_lists.rkt rename to Programming Languages/Part B/Week 1/85_racket_lists.rkt diff --git a/Programming Languages/Part B/87_parens_matter.rkt b/Programming Languages/Part B/Week 1/87_parens_matter.rkt similarity index 100% rename from Programming Languages/Part B/87_parens_matter.rkt rename to Programming Languages/Part B/Week 1/87_parens_matter.rkt diff --git a/Programming Languages/Part B/88_dynamic_typing.rkt b/Programming Languages/Part B/Week 1/88_dynamic_typing.rkt similarity index 100% rename from Programming Languages/Part B/88_dynamic_typing.rkt rename to Programming Languages/Part B/Week 1/88_dynamic_typing.rkt diff --git a/Programming Languages/Part B/Week 1/89_cond.rkt b/Programming Languages/Part B/Week 1/89_cond.rkt new file mode 100644 index 0000000..87f10c4 --- /dev/null +++ b/Programming Languages/Part B/Week 1/89_cond.rkt @@ -0,0 +1,26 @@ +; Programming Languages, Dan Grossman +; Section 5: Cond + +#lang racket + +(provide (all-defined-out)) + +; sum3 is equivalent to sum1 from previous segment but better style +(define (sum3 xs) + (cond [(null? xs) 0] + [(number? (car xs)) (+ (car xs)(sum3 (cdr xs)))] + [#t (+ (sum3 (car xs)) (sum3 (cdr xs)))])) + +; sum4 is equivalent to sum2 from previous segment but better style +(define (sum4 xs) + (cond [(null? xs) 0] + [(number? xs) xs] + [(list? (car xs)) (+ (sum4 (car xs)) (sum4 (cdr xs)))] + [#t (sum4 (cdr xs))])) + +; this function counts how many #f are in a (non-nested) list +; it uses the "controversial" idiom of anything not #f is true +(define (count-falses xs) + (cond [(null? xs) 0] + [(car xs) (count-falses (cdr xs))] ; (car xs) can have any type + [#t (+ 1 (count-falses (cdr xs)))])) diff --git a/Programming Languages/Part B/89_cond.rkt b/Programming Languages/Part B/Week 1/89_cond.rkt~ similarity index 100% rename from Programming Languages/Part B/89_cond.rkt rename to Programming Languages/Part B/Week 1/89_cond.rkt~ diff --git a/Programming Languages/Part B/90_local_bindings.rkt b/Programming Languages/Part B/Week 1/90_local_bindings.rkt similarity index 100% rename from Programming Languages/Part B/90_local_bindings.rkt rename to Programming Languages/Part B/Week 1/90_local_bindings.rkt diff --git a/Programming Languages/Part B/91_toplevel_bindings.rkt b/Programming Languages/Part B/Week 1/91_toplevel_bindings.rkt similarity index 100% rename from Programming Languages/Part B/91_toplevel_bindings.rkt rename to Programming Languages/Part B/Week 1/91_toplevel_bindings.rkt diff --git a/Programming Languages/Part B/92_setbang.rkt b/Programming Languages/Part B/Week 1/92_setbang.rkt similarity index 100% rename from Programming Languages/Part B/92_setbang.rkt rename to Programming Languages/Part B/Week 1/92_setbang.rkt diff --git a/Programming Languages/Part B/93_truth_about_cons.rkt b/Programming Languages/Part B/Week 1/93_truth_about_cons.rkt similarity index 100% rename from Programming Languages/Part B/93_truth_about_cons.rkt rename to Programming Languages/Part B/Week 1/93_truth_about_cons.rkt diff --git a/Programming Languages/Part B/94_mcons.rkt b/Programming Languages/Part B/Week 1/94_mcons.rkt similarity index 100% rename from Programming Languages/Part B/94_mcons.rkt rename to Programming Languages/Part B/Week 1/94_mcons.rkt diff --git a/Programming Languages/Part B/95_thunks.rkt b/Programming Languages/Part B/Week 1/95_thunks.rkt similarity index 100% rename from Programming Languages/Part B/95_thunks.rkt rename to Programming Languages/Part B/Week 1/95_thunks.rkt diff --git a/Programming Languages/Part B/96_avoid_unnecessary.rkt b/Programming Languages/Part B/Week 1/96_avoid_unnecessary.rkt similarity index 100% rename from Programming Languages/Part B/96_avoid_unnecessary.rkt rename to Programming Languages/Part B/Week 1/96_avoid_unnecessary.rkt diff --git a/Programming Languages/Part B/97_delay_force.rkt b/Programming Languages/Part B/Week 1/97_delay_force.rkt similarity index 100% rename from Programming Languages/Part B/97_delay_force.rkt rename to Programming Languages/Part B/Week 1/97_delay_force.rkt diff --git a/Programming Languages/Part B/98_using_streams.rkt b/Programming Languages/Part B/Week 1/98_using_streams.rkt similarity index 100% rename from Programming Languages/Part B/98_using_streams.rkt rename to Programming Languages/Part B/Week 1/98_using_streams.rkt diff --git a/Programming Languages/Part B/99_defining_streams.rkt b/Programming Languages/Part B/Week 1/99_defining_streams.rkt similarity index 100% rename from Programming Languages/Part B/99_defining_streams.rkt rename to Programming Languages/Part B/Week 1/99_defining_streams.rkt diff --git a/Programming Languages/Part B/README.md b/Programming Languages/Part B/Week 1/README.md similarity index 100% rename from Programming Languages/Part B/README.md rename to Programming Languages/Part B/Week 1/README.md diff --git a/Programming Languages/Part B/Week 1/curry.jpg b/Programming Languages/Part B/Week 1/curry.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54491ecff39cf5b23152093bcdf8d9efbfbc6105 GIT binary patch literal 9537 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�n2 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%0DIeEoa6}C!X)2;G~tw6&1N(x{lCE2!0;OPd1 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 A8~^|S literal 0 HcmV?d00001 diff --git a/Programming Languages/Part B/Week 1/dog.jpg b/Programming Languages/Part B/Week 1/dog.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4354b76a8bca701cdb864372c94eb8e0192b886 GIT binary patch literal 17097 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 literal 0 HcmV?d00001 diff --git a/Programming Languages/Part B/Week 1/dog2.jpg b/Programming Languages/Part B/Week 1/dog2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6900a121d1ac1cf32eb1bc39559beb9b68c3516e GIT binary patch literal 15875 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 literal 0 HcmV?d00001 diff --git a/Programming Languages/Part B/Week 1/hw4.rkt b/Programming Languages/Part B/Week 1/hw4.rkt new file mode 100644 index 0000000..ff5f7b6 --- /dev/null +++ b/Programming Languages/Part B/Week 1/hw4.rkt @@ -0,0 +1,79 @@ + +#lang racket + +(provide (all-defined-out)) ;; so we can put tests in a second file + +;; put your code below + + +(define (sequence low high stride) + (if (> low high) + null + (cons low (sequence (+ low stride) high stride)))) + + +(define (string-append-map xs suffix) + (map (lambda (x) (string-append x suffix)) xs)) + +(define (list-nth-mod xs n) + (cond [(< n 0) (error "list-nth-mod: negative number")] + [(empty? xs) (error "list-nth-mod: empty list")] + [#t (car (list-tail xs (remainder n (length xs))))])) + + +(define (stream-for-n-steps s n) + (if (= n 0) + null + (let ([pair (s)]) + (cons (car pair) + (stream-for-n-steps (cdr pair) (- n 1)))))) + +(define funny-number-stream + (letrec ([f (lambda (x) (cons (if (= (remainder x 5) 0) (- 0 x) x) (lambda () (f (+ x 1)))))]) + (lambda () (f 1)))) + +(define dan-then-dog + (letrec ([f (lambda (x) (cons x (lambda () (f (if (string=? x "dog.jpg") "dan.jpg" "dog.jpg")))))]) + (lambda () (f "dan.jpg")))) + +(define (stream-add-zero s) + (letrec ([f (lambda (s) + (let ([pr (s)]) + (cons (cons 0 (car pr)) (lambda () (f (cdr pr))))))]) + (lambda () (f s)))) + + +(define (cycle-lists xs ys) + (letrec ([f (lambda (x) + (cons + (cons (list-nth-mod xs x) (list-nth-mod ys x)) + (lambda () (f (+ x 1)))))]) + (lambda () (f 0)))) + + +(define (vector-assoc v vec) + (letrec ([f (lambda (i) + (cond + [(equal? (vector-length vec) i) #f] + [(not (pair? (vector-ref vec i))) (f (+ i 1))] + [(equal? (car (vector-ref vec i)) v) (vector-ref vec i)] + [else (f (+ i 1))]))]) + (f 0))) + + +(define (cached-assoc xs n) + (letrec ([memo (make-vector n #f)] + [iter 0] + [f (lambda (val) + (let ([ans (vector-assoc val memo)]) + (if ans + (cdr ans) + (let ([new-ans (assoc val xs)]) + (begin + (vector-set! memo iter (cons val new-ans)) + (set! iter (if (= (+ 1 iter) n) 0 (+ iter 1))) + new-ans)))))]) + (lambda (v) (f v)))) + + + diff --git a/Programming Languages/Part B/Week 1/hw4test.rkt b/Programming Languages/Part B/Week 1/hw4test.rkt new file mode 100644 index 0000000..ec13609 --- /dev/null +++ b/Programming Languages/Part B/Week 1/hw4test.rkt @@ -0,0 +1,60 @@ +#lang racket +;; Programming Languages Homework4 Simple Test +;; Save this file to the same directory as your homework file +;; These are basic tests. Passing these tests does not guarantee that your code will pass the actual homework grader + +;; Be sure to put your homework file in the same folder as this test file. +;; Uncomment the line below and change HOMEWORK_FILE to the name of your homework file. +(require "hw4.rkt") + +(require rackunit) + +;; Helper functions +(define ones (lambda () (cons 1 ones))) +(define a 2) + +(define tests + (test-suite + "Sample tests for Assignment 4" + + ; sequence test + (check-equal? (sequence 0 5 1) (list 0 1 2 3 4 5) "Sequence test") + + ; string-append-map test + (check-equal? (string-append-map + (list "dan" "dog" "curry" "dog2") + ".jpg") '("dan.jpg" "dog.jpg" "curry.jpg" "dog2.jpg") "string-append-map test") + + ; list-nth-mod test + (check-equal? (list-nth-mod (list 0 1 2 3 4) 2) 2 "list-nth-mod test") + + ; stream-for-n-steps test + (check-equal? (stream-for-n-steps ones 2) (list 1 1) "stream-for-n-steps test") + + ; funny-number-stream test + (check-equal? (stream-for-n-steps funny-number-stream 16) (list 1 2 3 4 -5 6 7 8 9 -10 11 12 13 14 -15 16) "funny-number-stream test") + + ; dan-then-dog test + (check-equal? (stream-for-n-steps dan-then-dog 1) (list "dan.jpg") "dan-then-dog test") + + ; stream-add-zero test + (check-equal? (stream-for-n-steps (stream-add-zero ones) 1) (list (cons 0 1)) "stream-add-zero test") + + ; cycle-lists test + (check-equal? (stream-for-n-steps (cycle-lists (list 1 2 3) (list "a" "b")) 3) (list (cons 1 "a") (cons 2 "b") (cons 3 "a")) + "cycle-lists test") + + ; vector-assoc test + (check-equal? (vector-assoc 4 (vector (cons 2 1) (cons 3 1) (cons 4 1) (cons 5 1))) (cons 4 1) "vector-assoc test") + + ; cached-assoc tests + (check-equal? ((cached-assoc (list (cons 1 2) (cons 3 4)) 3) 3) (cons 3 4) "cached-assoc test") + + ; while-less test + ;(check-equal? (while-less 7 do (begin (set! a (+ a 1)) a)) #t "while-less test") + + )) + +(require rackunit/text-ui) +;; runs the test +(run-tests tests) diff --git a/Programming Languages/Part B/Week 2/107_datatypes_without_structs.rkt b/Programming Languages/Part B/Week 2/107_datatypes_without_structs.rkt new file mode 100644 index 0000000..f7a2be8 --- /dev/null +++ b/Programming Languages/Part B/Week 2/107_datatypes_without_structs.rkt @@ -0,0 +1,63 @@ +; Programming Languages, Dan Grossman +; Section 6: Datatype Programming in Racket Without Structs + +#lang racket +(provide (all-defined-out)) + +; we do not need a datatype to create a list holding a mix of numbers and string +; Note: arguably bad style to not have else clause but makes example more like ML code +(define (funny-sum xs) + (cond [(null? xs) 0] + [(number? (car xs)) (+ (car xs) (funny-sum (cdr xs)))] + [(string? (car xs)) (+ (string-length (car xs)) (funny-sum (cdr xs)))])) + +; suppose we wanted a "one-of type" using nothing but lists and symbols and such, like ML's +; datatype exp = Const of int | Negate of exp | Add of exp * exp | Multiply of exp * exp + +; just helper functions that make lists where first element is a symbol +; Note: More robust could check at run-time the type of thing being put in +(define (Const i) (list 'Const i)) +(define (Negate e) (list 'Negate e)) +(define (Add e1 e2) (list 'Add e1 e2)) +(define (Multiply e1 e2) (list 'Multiply e1 e2)) + +; just helper functions that test what "kind of exp" +; Note: More robust could raise better errors for non-exp values +(define (Const? x) (eq? (car x) 'Const)) +(define (Negate? x) (eq? (car x) 'Negate)) +(define (Add? x) (eq? (car x) 'Add)) +(define (Multiply? x) (eq? (car x) 'Multiply)) + +; just helper functions that get the pieces for "one kind of exp" +; Note: More robust could check "what kind of exp" +(define (Const-int e) (car (cdr e))) +(define (Negate-e e) (car (cdr e))) +(define (Add-e1 e) (car (cdr e))) +(define (Add-e2 e) (car (cdr (cdr e)))) +(define (Multiply-e1 e) (car (cdr e))) +(define (Multiply-e2 e) (car (cdr (cdr e)))) + +; fyi: there are built-in functions for getting 2nd, 3rd list elements that would +; have made the above simpler: +;(define Const-int cadr) +;(define Negate-e cadr) +;(define Add-e1 cadr) +;(define Add-e2 caddr) +;(define Multiply-e1 cadr) +;(define Multiply-e2 caddr) + +; same recursive structure as we have in ML, just without pattern-matching +; And one change from what we did before: returning an exp, in particular +; a Constant, rather than an int +(define (eval-exp e) + (cond [(Const? e) e] ; note returning an exp, not a number + [(Negate? e) (Const (- (Const-int (eval-exp (Negate-e e)))))] + [(Add? e) (let ([v1 (Const-int (eval-exp (Add-e1 e)))] + [v2 (Const-int (eval-exp (Add-e2 e)))]) + (Const (+ v1 v2)))] + [(Multiply? e) (let ([v1 (Const-int (eval-exp (Multiply-e1 e)))] + [v2 (Const-int (eval-exp (Multiply-e2 e)))]) + (Const (* v1 v2)))] + [#t (error "eval-exp expected an exp")])) + +(define a-test (eval-exp (Multiply (Negate (Add (Const 2) (Const 2))) (Const 7)))) \ No newline at end of file diff --git a/Programming Languages/Part B/Week 2/107_datatypes_without_structs.sml b/Programming Languages/Part B/Week 2/107_datatypes_without_structs.sml new file mode 100644 index 0000000..51f00ed --- /dev/null +++ b/Programming Languages/Part B/Week 2/107_datatypes_without_structs.sml @@ -0,0 +1,53 @@ +(* Programming Languages, Dan Grossman *) +(* Section 6: Datatype Programming in Racket Without Structs *) + +datatype int_or_string = I of int | S of string + +fun funny_sum xs = + case xs of + [] => 0 + | (I i)::xs' => i + funny_sum xs' + | (S s)::xs' => String.size s + funny_sum xs' + +datatype exp = Const of int + | Negate of exp + | Add of exp * exp + | Multiply of exp * exp + +(* exp -> int *) +fun eval_exp_old e = + case e of + Const i => i + | Negate e2 => ~ (eval_exp_old e2) + | Add(e1,e2) => (eval_exp_old e1) + (eval_exp_old e2) + | Multiply(e1,e2) => (eval_exp_old e1) * (eval_exp_old e2) + +(* exp -> exp *) +(* this way is more painful here, but makes much more sense for + larger languages where recursive calls can return different kinds of + things (e.g., numbers or pairs or functions or ... ) +*) +exception Error of string + +fun eval_exp_new e = + let + fun get_int e = + case e of + Const i => i + | _ => raise (Error "expected Const result") + in + case e of + Const _ => + e + | Negate e2 => + Const (~ (get_int (eval_exp_new e2))) + | Add(e1,e2) => + Const ((get_int (eval_exp_new e1)) + (get_int (eval_exp_new e2))) + | Multiply(e1,e2) => + Const ((get_int (eval_exp_new e1)) * (get_int (eval_exp_new e2))) + end + +val test_exp = Multiply (Negate (Add (Const 2,Const 2)), Const 7) +val old_test = eval_exp_old test_exp (* ~28 *) +val new_test = eval_exp_new test_exp (* Const ~28 *) + diff --git a/Programming Languages/Part B/Week 2/108_datatypes_with_structs.rkt b/Programming Languages/Part B/Week 2/108_datatypes_with_structs.rkt new file mode 100644 index 0000000..6f10e75 --- /dev/null +++ b/Programming Languages/Part B/Week 2/108_datatypes_with_structs.rkt @@ -0,0 +1,24 @@ +; Programming Languages, Dan Grossman +; Section 6: Datatypes With Struct + +#lang racket + +(provide (all-defined-out)) + +(struct const (int) #:transparent) +(struct negate (e) #:transparent) +(struct add (e1 e2) #:transparent) +(struct multiply (e1 e2) #:transparent) + +(define (eval-exp e) + (cond [(const? e) e] ; note returning an exp, not a number + [(negate? e) (const (- (const-int (eval-exp (negate-e e)))))] + [(add? e) (let ([v1 (const-int (eval-exp (add-e1 e)))] + [v2 (const-int (eval-exp (add-e2 e)))]) + (const (+ v1 v2)))] + [(multiply? e) (let ([v1 (const-int (eval-exp (multiply-e1 e)))] + [v2 (const-int (eval-exp (multiply-e2 e)))]) + (const (* v1 v2)))] + [#t (error "eval-exp expected an exp")])) + +(define a-test (eval-exp (multiply (negate (add (const 2) (const 2))) (const 7)))) \ No newline at end of file diff --git a/Programming Languages/Part B/Week 2/111_interpreter_assumptions.rkt b/Programming Languages/Part B/Week 2/111_interpreter_assumptions.rkt new file mode 100644 index 0000000..d962340 --- /dev/null +++ b/Programming Languages/Part B/Week 2/111_interpreter_assumptions.rkt @@ -0,0 +1,95 @@ +; Programming Languages, Dan Grossman +; Section 6: What Your Interpreter Can and Cannot Assume + +#lang racket + +(provide (all-defined-out)) + +; a larger language with two kinds of values, booleans and numbers +; an expression is any of these: +(struct const (int) #:transparent) ; int should hold a number +(struct negate (e1) #:transparent) ; e1 should hold an expression +(struct add (e1 e2) #:transparent) ; e1, e2 should hold expressions +(struct multiply (e1 e2) #:transparent) ; e1, e2 should hold expressions +(struct bool (b) #:transparent) ; b should hold #t or #f +(struct eq-num (e1 e2) #:transparent) ; e1, e2 should hold expressions +(struct if-then-else (e1 e2 e3) #:transparent) ; e1, e2, e3 should hold expressions +; a value in this language is a legal const or bool + +(define test1 (multiply (negate (add (const 2) + (const 2))) + (const 7))) + +(define test2 (multiply (negate (add (const 2) + (const 2))) + (if-then-else (bool #f) + (const 7) + (bool #t)))) + +(define non-test (multiply (negate (add (const #t) + (const 2))) + (const 7))) + +(define (eval-exp-wrong e) + (cond [(const? e) + e] + [(negate? e) + (const (- (const-int (eval-exp-wrong (negate-e1 e)))))] + [(add? e) + (let ([i1 (const-int (eval-exp-wrong (add-e1 e)))] + [i2 (const-int (eval-exp-wrong (add-e2 e)))]) + (const (+ i1 i2)))] + [(multiply? e) + (let ([i1 (const-int (eval-exp-wrong (multiply-e1 e)))] + [i2 (const-int (eval-exp-wrong (multiply-e2 e)))]) + (const (* i1 i2)))] + [(bool? e) + e] + [(eq-num? e) + (let ([i1 (const-int (eval-exp-wrong (eq-num-e1 e)))] + [i2 (const-int (eval-exp-wrong (eq-num-e2 e)))]) + (bool (= i1 i2)))] ; creates (bool #t) or (bool #f) + [(if-then-else? e) + (if (bool-b (eval-exp-wrong (if-then-else-e1 e))) + (eval-exp-wrong (if-then-else-e2 e)) + (eval-exp-wrong (if-then-else-e3 e)))] + [#t (error "eval-exp expected an exp")] ; not strictly necessary but helps debugging + )) + +(define (eval-exp e) + (cond [(const? e) + e] + [(negate? e) + (let ([v (eval-exp (negate-e1 e))]) + (if (const? v) + (const (- (const-int v))) + (error "negate applied to non-number")))] + [(add? e) + (let ([v1 (eval-exp (add-e1 e))] + [v2 (eval-exp (add-e2 e))]) + (if (and (const? v1) (const? v2)) + (const (+ (const-int v1) (const-int v2))) + (error "add applied to non-number")))] + [(multiply? e) + (let ([v1 (eval-exp (multiply-e1 e))] + [v2 (eval-exp (multiply-e2 e))]) + (if (and (const? v1) (const? v2)) + (const (* (const-int v1) (const-int v2))) + ((error "multiply applied to non-number"))))] + [(bool? e) + e] + [(eq-num? e) + (let ([v1 (eval-exp (eq-num-e1 e))] + [v2 (eval-exp (eq-num-e2 e))]) + (if (and (const? v1) (const? v2)) + (bool (= (const-int v1) (const-int v2))) ; creates (bool #t) or (bool #f) + (error "eq-num applied to non-number")))] + [(if-then-else? e) + (let ([v-test (eval-exp (if-then-else-e1 e))]) + (if (bool? v-test) + (if (bool-b v-test) + (eval-exp (if-then-else-e2 e)) + (eval-exp (if-then-else-e3 e))) + (error "if-then-else applied to non-boolean")))] + [#t (error "eval-exp expected an exp")] ; not strictly necessary but helps debugging + )) diff --git a/Programming Languages/Part B/Week 2/115_macros_via_functions.rkt b/Programming Languages/Part B/Week 2/115_macros_via_functions.rkt new file mode 100644 index 0000000..16ae9f2 --- /dev/null +++ b/Programming Languages/Part B/Week 2/115_macros_via_functions.rkt @@ -0,0 +1,82 @@ +; Programming Languages, Dan Grossman +; Section 6: Using Racket Functions to Add "Macros" to a Language + +#lang racket + +(provide (all-defined-out)) + +; we start with the same language and interpreter from +; "What Your Interpreter Can and Cannot Assume" + +; the new stuff are the "macros" as the bottom + +; a larger language with two kinds of values, booleans and numbers +; an expression is any of these: +(struct const (int) #:transparent) ; int should hold a number +(struct negate (e1) #:transparent) ; e1 should hold an expression +(struct add (e1 e2) #:transparent) ; e1, e2 should hold expressions +(struct multiply (e1 e2) #:transparent) ; e1, e2 should hold expressions +(struct bool (b) #:transparent) ; b should hold #t or #f +(struct eq-num (e1 e2) #:transparent) ; e1, e2 should hold expressions +(struct if-then-else (e1 e2 e3) #:transparent) ; e1, e2, e3 should hold expressions +; a value in this language is a legal const or bool + +(define (eval-exp e) + (cond [(const? e) + e] + [(negate? e) + (let ([v (eval-exp (negate-e1 e))]) + (if (const? v) + (const (- (const-int v))) + (error "negate applied to non-number")))] + [(add? e) + (let ([v1 (eval-exp (add-e1 e))] + [v2 (eval-exp (add-e2 e))]) + (if (and (const? v1) (const? v2)) + (const (+ (const-int v1) (const-int v2))) + (error "add applied to non-number")))] + [(multiply? e) + (let ([v1 (eval-exp (multiply-e1 e))] + [v2 (eval-exp (multiply-e2 e))]) + (if (and (const? v1) (const? v2)) + (const (* (const-int v1) (const-int v2))) + (error "multiply applied to non-number")))] + [(bool? e) + e] + [(eq-num? e) + (let ([v1 (eval-exp (eq-num-e1 e))] + [v2 (eval-exp (eq-num-e2 e))]) + (if (and (const? v1) (const? v2)) + (bool (= (const-int v1) (const-int v2))) ; creates (bool #t) or (bool #f) + (error "eq-num applied to non-number")))] + [(if-then-else? e) + (let ([v-test (eval-exp (if-then-else-e1 e))]) + (if (bool? v-test) + (if (bool-b v-test) + (eval-exp (if-then-else-e2 e)) + (eval-exp (if-then-else-e3 e))) + (error "if-then-else applied to non-boolean")))] + [#t (error "eval-exp expected an exp")] ; not strictly necessary but helps debugging + )) + +; Here are two Racket functions that given language-being-implemented syntax, +; produce language-being-implemented syntax +(define (andalso e1 e2) + (if-then-else e1 e2 (bool #f))) + +(define (double e) + (multiply e (const 2))) + +; this one takes a Racket list of language-being-implemented syntax +; and makes language-being-implemented syntax +(define (list-product es) + (if (null? es) + (const 1) + (multiply (car es) (list-product (cdr es))))) + +(define test (andalso (eq-num (double (const 4)) + (list-product (list (const 2) (const 2) (const 1) (const 2)))) + (bool #t))) + +; notice we have not changed our interpreter at all +(define result (eval-exp test))