Presentation is loading. Please wait.

Presentation is loading. Please wait.

Practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי ) שיטות חישוב : Applicative & Normal Evaluation Partial Evaluation.

Similar presentations


Presentation on theme: "Practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי ) שיטות חישוב : Applicative & Normal Evaluation Partial Evaluation."— Presentation transcript:

1 Practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי ) שיטות חישוב : Applicative & Normal Evaluation Partial Evaluation

2 : Kinds:, : Kinds:, : Kinds:,, : Kinds:, : Kinds: numbers. : Kinds: #t, #f : Kinds: Restricted sequences of letters, digits, punctuation marks : Kinds:,,, : Components: Variable: Expression: : Components: Parameter:. Amount: >= 0. Ordered. Body:. Amount: >= 1. Ordered. : Components: Quoted-name: : Components: Predicate: Consequence: Alternative: And more…

3 -> | ’(’ ’)’ -> | | -> | -> Numbers -> ’#t’ | ’#f’ -> Restricted sequences of letters, digits, punctuation marks -> | | | | -> + -> ’define’ -> ’lambda’ ’(’ * ’)’ + -> ’quote’ -> ’cond’ * -> ’(’ + ’)’ -> ’(’ ’else’ + ’)’ -> ’if’ -> ’let’ ’(’ * ’)’ +

4  שאלה 1: נרצה להוסיף לשפה ביטוי הדומה ל -if, אבל בלי האלטרנטיבה, שייראה כך : (when pred-exp cons-exps)  דוגמאות : ((when (> x 5) (+ x 3) (when (> x 5) (display x) (* x x))  אילו שינויים צריך לעשות בתחביר ?

5 : Kinds:, : Kinds:, : Kinds:, : Kinds:,,, : Components: Test: Body: + Amount: >=1. Ordered,

6 -> | ’(’ ’)’ -> | -> | | | | -> ’if’ -> ‘when’ + |

7  שאלה 2: ראינו שהתחביר הממשי תומך בהגדרת משתנה באופן הבא : -> ‘define’  איך ישתנה התחביר אם נרצה להוסיף אפשרות להגדיר משתנה כך : (x is 3) ?  תשובה : התחביר הממשי ישתנה כך : -> ‘define’ | ‘is‘ רק !

8 שתי פונקציות להערכת ביטויים ב -Scheme:  applicative-eval(e) eval-substitute-reduce  normal-eval(e) substitute-reduce

9  שאלה 4: לכל מופע קושר (Binding Instance) ציינו את תחום ההגדרה (Scope) שלו ואת המופעים הקשורים (Bound Occurrence) אליו. כמו כן, ציינו מופעים חופשיים של משתנים : 1(define even? (lambda (n) 2(eq? (/ n 2) 0))) 3(define expt? (lambda (n) 4 (cond ((= n 1) #t) 5 ((even? n) (expt? (/ n 2))) 6 (else #f))))

10  שאלה 5: התבוננו בקטע הקוד הבא. למה צריך לבצע renaming? >(define z not) >(((lambda (x) (lambda (z) (x z))) (lambda (w) (z w))) #f)

11 >(define z not) >(((lambda (x) (lambda (z) (x z))) (lambda (w) (z w))) #f) >(define z not) >(((lambda (x) (lambda (z1) (x z1))) (lambda (w1) (z w1))) #f)

12  שאלה 6: applicative-eval [ ((lambda (x z) (* (+ x z) z)) 1 (+ 1 2) ) ] applicative-eval [ (lambda (x z) (* (+ x z) z)) ] ==> applicative-eval [1] ==> 1 applicative-eval [(+ 1 2)] applicative-eval [+] ==> # applicative-eval [1] ==> 1 applicative-eval [2] ==> 2 ==>3

13 (* (+ x z) z) {x = 1} ==> (* (+ 1 z) z) (* (+ 1 z) z) {z = 3} ==> (* (+ 1 3) 3) reduce: applicative-eval [(* (+ 1 3) 3)] applicative-eval [*] ==> # applicative-eval [(+ 1 3)] applicative-eval [+] ==> # applicative-eval [1] ==> 1 applicative-eval [3] ==> 3 ==> 4 applicative-eval [3]==> 3 ==> 12

14  שאלה 7: התבוננו בקטע הקוד הבא : >(define loop (lambda (x) (loop x))) >(define g (lambda (x y) y))  מה יקרה לאחר הפעלת השורה הבאה לפי כל אחת משיטות החישוב ? >(g (loop 0) 7)

15  שאלה 8: >(define test (lambda (x y) (if (= x 0) 0 y))) >(define zero-div (lambda (n) (/ n 0))) ;division by zero!  מהן תוצאות החישוב : (test 0 (zero-div 5)) בשני האלגוריתמים?

16 >(define test (lambda (x y) (if (= x 0) 0 y))) >(define zero-div (lambda (n) (/ n 0))) ;division by zero! >(test 0 (zero-div 5)) normal-eval [ (test 0 (zero-div 5)) ] normal-eval [test]==> (if (= x 0) 0 y)) {x = 0}==> (if (= 0 0) 0 y)) (if (= 0 0) 0 y)) {y = (zero-div 5)}==> (if (= 0 0) 0 (zero-div 5) )) reduce: normal-eval[(if (= 0 0) 0 (zero-div 5)))] normal-eval[(= 0 0)] normal-eval[ = ] ==># normal-eval[ 0 ] ==>0 ==> #t normal-eval[0] ==> 0 ==>0 מה היה קורה אם היינו מחשבים לפי applicative-eval??

17  שאלה 9: איך אפשר לדעת לפי איזו שיטה עובר האינטרפרטר ? >(define f (lambda(x) 1) >(define g (lambda (x) 2)  אם אין side-effects נקבל רק את הערך שיוחזר מחישוב הביטוי, וערך זה הוא תמיד זהה בהנחה שהחישוב מסתיים בשתי השיטות. אז ניצור side-effects...

18  שאלה 9: איך אפשר לדעת לפי איזו שיטה עובד האינטרפרטר ? > (define normal (lambda () (display 'applicative) 0 )) > (define test (lambda(x) 1)) > (test (normal)) Applicative: ‘applicative 1 Normal:1

19  שאלה 10: ניזכר במימוש האיטרטיבי להעלאה בחזקה שראינו בשיעור שעבר : (define exp (lambda (b e) (exp-iter b e 1))) (define exp-iter (lambda (b e acc) (cond ((= e 0) acc) (else (exp-iter b (- e 1) (* b acc))))))  מהו ה -Scope של הפונקציה exp-iter?

20  ניסוח מחדש : (define exp (lambda (b e) (letrec ((exp-iter (lambda (b e acc) (cond ((= e 0) acc) (else (exp-iter b (- e 1) (* b acc))))))) (exp-iter b e 1))))  מה עוד אפשר לשפר..?


Download ppt "Practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי ) שיטות חישוב : Applicative & Normal Evaluation Partial Evaluation."

Similar presentations


Ads by Google