7 WAE extension and evaluation WAE parser WAE

  • Slides: 22
Download presentation
7 תכנות שפות תרגול WAE extension and evaluation

7 תכנות שפות תרגול WAE extension and evaluation

. עצרת הוספת WAE - הרחבת parser- ה הרחבת – שני שלב : WAE

. עצרת הוספת WAE - הרחבת parser- ה הרחבת – שני שלב : WAE מסוג חדש constractor נגדיר eval ובהמשך גם את parser בכדי להרחיב את ה (define-type WAE [Num Number] [Add WAE] [Sub WAE] [Mul WAE] [Div WAE] [Id Symbol] [With Symbol WAE] ? ? ) :

. עצרת הוספת WAE - הרחבת parser- ה הרחבת – שני שלב : WAE

. עצרת הוספת WAE - הרחבת parser- ה הרחבת – שני שלב : WAE מסוג חדש constractor נגדיר eval ובהמשך גם את parser בכדי להרחיב את ה (define-type WAE [Num Number] [Add WAE] [Sub WAE] [Mul WAE] [Div WAE] [Id Symbol] [With Symbol WAE] [Fact WAE] ) :

. עצרת הוספת WAE - הרחבת parser- ה הרחבת – שני שלב (: parse-sexpr

. עצרת הוספת WAE - הרחבת parser- ה הרחבת – שני שלב (: parse-sexpr : Sexpr -> WAE) (define (parse-sexpr) (match sexpr [(number: n) (Num n)] [(symbol: name) (Id name)] : [(cons 'with more) (match sexpr [(list 'with (list (symbol: name) named) body) (With name (parse-sexpr named) (parse-sexpr body))] [else (error 'parse-sexpr "bad `with' syntax in ~s" sexpr)])] [(list '+ lhs rhs) (Add (parse-sexpr lhs) (parse-sexpr rhs))] [(list '- lhs rhs) (Sub (parse-sexpr lhs) (parse-sexpr rhs))] [(list '* lhs rhs) (Mul (parse-sexpr lhs) (parse-sexpr rhs))] [(list '/ lhs rhs) (Div (parse-sexpr lhs) (parse-sexpr rhs))] ? ? ? ? ? [else (error 'parse-sexpr "bad syntax in ~s" sexpr)]))

. עצרת הוספת WAE - הרחבת parser- ה הרחבת – שני שלב (: parse-sexpr

. עצרת הוספת WAE - הרחבת parser- ה הרחבת – שני שלב (: parse-sexpr : Sexpr -> WAE) (define (parse-sexpr) (match sexpr [(number: n) (Num n)] [(symbol: name) (Id name)] : [(cons 'with more) (match sexpr [(list 'with (list (symbol: name) named) body) (With name (parse-sexpr named) (parse-sexpr body))] [else (error 'parse-sexpr "bad `with' syntax in ~s" sexpr)])] [(list '+ lhs rhs) (Add (parse-sexpr lhs) (parse-sexpr rhs))] [(list '- lhs rhs) (Sub (parse-sexpr lhs) (parse-sexpr rhs))] [(list '* lhs rhs) (Mul (parse-sexpr lhs) (parse-sexpr rhs))] [(list '/ lhs rhs) (Div (parse-sexpr lhs) (parse-sexpr rhs))] [(list '! exp) (Fact (parse-sexpr exp))] [else (error 'parse-sexpr "bad syntax in ~s" sexpr)]))

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב fact: הפונקציה

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב fact: הפונקציה מימוש . השני מהתרגול במימוש נשתמש . קלט בדיקת נוסיף (: fact-op : Number -> Natural) (define (fact-op n) (: fact-op-help : Natural -> Natural) (define (fact-op-help n acc) (if (> n 0) (fact-op-help (- n 1) (* n acc)) (if (and (integer? n) (exact? n) (not (negative? n))) (fact-op-help n 1) (error 'fact-op "Expected Exact-Nonnegative-Integer got: ~s" n)))

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . eval

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . eval הפרוצדורה את נעדכן . (specifications) פורמלית . תכנותית #| Formal specs for `eval': eval(N) = N eval({+ E 1 E 2}) = eval(E 1) + eval(E 2) eval({- E 1 E 2}) = eval(E 1) - eval(E 2) eval({* E 1 E 2}) = eval(E 1) * eval(E 2) eval({/ E 1 E 2}) = eval(E 1) / eval(E 2) eval(id) = error! eval({with {x E 1} E 2}) = eval(E 2[eval(E 1)/x]) ? ? ? |#

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . eval

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . eval הפרוצדורה את נעדכן . (specifications) פורמלית . תכנותית #| Formal specs for `eval': eval(N) = N eval({+ E 1 E 2}) = eval(E 1) + eval(E 2) eval({- E 1 E 2}) = eval(E 1) - eval(E 2) eval({* E 1 E 2}) = eval(E 1) * eval(E 2) eval({/ E 1 E 2}) = eval(E 1) / eval(E 2) eval(id) = error! eval({with {x E 1} E 2}) = eval(E 2[eval(E 1)/x]) eval({! E 1}) = eval(E 1)! |#

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . eval

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . eval הפרוצדורה את נעדכן . (specifications) פורמלית . תכנותית (: eval : WAE -> Number) (define (eval expr) (cases expr [(Num n) n] [(Add l r) (+ (eval l) (eval r))] [(Sub l r) (- (eval l) (eval r))] [(Mul l r) (* (eval l) (eval r))] [(Div l r) (/ (eval l) (eval r))] ? ? ? [(With bound-id named-expr bound-body) (eval (subst bound-body bound-id (Num (eval named-expr))))] [(Id name) (error 'eval "free identifier: ~s" name)]))

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . eval

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . eval הפרוצדורה את נעדכן . (specifications) פורמלית . תכנותית (: eval : WAE -> Number) (define (eval expr) (cases expr [(Num n) n] [(Add l r) (+ (eval l) (eval r))] [(Sub l r) (- (eval l) (eval r))] [(Mul l r) (* (eval l) (eval r))] [(Div l r) (/ (eval l) (eval r))] [(Fact n ) (fact-op (eval n))] [(With bound-id named-expr bound-body) (eval (subst bound-body bound-id (Num (eval named-expr))))] [(Id name) (error 'eval "free identifier: ~s" name)]))

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . subst

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . subst הפרוצדורה את נעדכן . (specifications) פורמלית #| Formal specs for `subst': (`N' is a <num>, `E 1', `E 2' are <WAE>s, `x' is some <id>, `y' is a *different* <id>) N[v/x] = N {+ E 1 E 2}[v/x] = {+ E 1[v/x] E 2[v/x]} {- E 1 E 2}[v/x] = {- E 1[v/x] E 2[v/x]} {* E 1 E 2}[v/x] = {* E 1[v/x] E 2[v/x]} {/ E 1 E 2}[v/x] = {/ E 1[v/x] E 2[v/x]} y[v/x] = y x[v/x] = v {with {y E 1} E 2}[v/x] = {with {y E 1[v/x]} E 2[v/x]} {with {x E 1} E 2}[v/x] = {with {x E 1[v/x]} E 2} ? ? ? |# . תכנותית

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . subst

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . subst הפרוצדורה את נעדכן . (specifications) פורמלית #| Formal specs for `subst': (`N' is a <num>, `E 1', `E 2' are <WAE>s, `x' is some <id>, `y' is a *different* <id>) N[v/x] = N {+ E 1 E 2}[v/x] = {+ E 1[v/x] E 2[v/x]} {- E 1 E 2}[v/x] = {- E 1[v/x] E 2[v/x]} {* E 1 E 2}[v/x] = {* E 1[v/x] E 2[v/x]} {/ E 1 E 2}[v/x] = {/ E 1[v/x] E 2[v/x]} y[v/x] = y x[v/x] = v {with {y E 1} E 2}[v/x] = {with {y E 1[v/x]} E 2[v/x]} {with {x E 1} E 2}[v/x] = {with {x E 1[v/x]} E 2} {! E 1}[v/x] = {! E 1[v/x]} |# . תכנותית

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . subst

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . subst הפרוצדורה את נעדכן . (specifications) פורמלית (: subst : WAE Symbol WAE -> WAE) (define (subst expr from to) (cases expr [(Num n) expr] [(Add l r) (Add (subst l from to) (subst r from to))] [(Sub l r) (Sub (subst l from to) (subst r from to))] [(Mul l r) (Mul (subst l from to) (subst r from to))] [(Div l r) (Div (subst l from to) (subst r from to))] ? ? [(Id name) (if (eq? name from) to expr)] [(With bound-id named-expr bound-body) (With bound-id (subst named-expr from to) (if (eq? bound-id from) bound-body (subst bound-body from to)))])) . תכנותית

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . subst

. עצרת הוספת WAE - הרחבת . eval שלישי – הרחבת שלב . subst הפרוצדורה את נעדכן . (specifications) פורמלית (: subst : WAE Symbol WAE -> WAE) (define (subst expr from to) (cases expr [(Num n) expr] [(Add l r) (Add (subst l from to) (subst r from to))] [(Sub l r) (Sub (subst l from to) (subst r from to))] [(Mul l r) (Mul (subst l from to) (subst r from to))] [(Div l r) (Div (subst l from to) (subst r from to))] [(Fact n) (Fact (subst n from to))] [(Id name) (if (eq? name from) to expr)] [(With bound-id named-expr bound-body) (With bound-id (subst named-expr from to) (if (eq? bound-id from) bound-body (subst bound-body from to)))])) . תכנותית

: הבא הביטוי את חשבו (run "{with {x {! 3 }} {+ x 2}}").

: הבא הביטוי את חשבו (run "{with {x {! 3 }} {+ x 2}}"). eval הראו את חישוב eval 1: (With (‘x (Fact (Num 3))) (Add (Id ‘x) (Num 2))) 8 res 1: _____ eval 2: (Fact (Num 3)) res 2: _____ 6 eval 3: (Num 3) res 3: _____ 3 eval 4: (Add (Num 6) (Num 2)) res 4: _____ 8 eval 5: (Num 6) res 5: _____ 6 eval 6: (Num 2) 2 res 6: _____

: הבא הביטוי את חשבו (run "{with {x {- 5 2}} {with {y {!

: הבא הביטוי את חשבו (run "{with {x {- 5 2}} {with {y {! x}} {- x y}}}"). eval הראו את חישוב eval 1: (With (‘x (Sub (Num 5)(Num 2))) (With (‘y (Fact ‘y)))) -3 res 1: _____ eval 2: (Sub 3 (Num 5)(Num 2)) res 2: _____ eval 3: (Num 5 5) res 3: _____ eval 4: (Num 2 2) res 4: _____ eval 5: (With -3 (‘y (Fact (Num 3))) (Sub (Num 3) (Id ‘y))) res 5: _____ eval 6: (Fact (Num 3)) 6 res 6: _____ eval 7: (Num 3 3) res 7: _____ (Id ‘x))) (Sub (Id ‘x) (Id eval 8: (Sub (Num 3) (Num 6)) res 8: _____ -3 eval 9: (Num 3) 3 res 9: _____ eval 10: (Num 6) res 10: _____ 6