Download presentation
Presentation is loading. Please wait.
Published byJeffry Jacobs Modified over 9 years ago
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)))) מה עוד אפשר לשפר..?
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.