practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי...
TRANSCRIPT
Principles of Programming
Languages Practice session 3
•) ( ) אבסטרקטי ) מופשט ותחביר קונקרטי ממשי תחביר• : חישוב Applicative & Normal Evaluationשיטות•Partial Evaluation
מופשט תחביר<scheme-exp>:
Kinds: <exp>, <define>
<exp>:
Kinds: <atomic>, <composite>
<atomic>:
Kinds: <number>, <boolean>, <variable>
<composite>:
Kinds: <special>, <form>
<number>:
Kinds: numbers.
<boolean>:
Kinds: #t, #f
<variable>:
Kinds: Restricted sequences of letters, digits, punctuation marks
<special>:
Kinds: <lambda>, <quote>, <cond>, <if>
<define>:Components: Variable: <variable>
Expression: <exp><lambda>:
Components: Parameter: <variable>. Amount: >= 0. Ordered.
Body: <exp>. Amount: >= 1 . Ordered.
<quote>:Components: Quoted-name: <variable>
<if>:Components: Predicate: <exp>
Consequence: <exp> Alternative: <exp>
And more…
<scheme-exp> -> <exp> | ’(’ <define> ’)’
<exp> -> <atomic> | ’(’ <composite> ’)’
<atomic> -> <number> | <boolean> | <variable>
<composite> -> <special> | <form>
<number> -> Numbers
<boolean> -> ’#t’ | ’#f’
<variable> -> Restricted sequences of letters, digits, punctuation marks
<special> -> <lambda> | <quote> | <cond> | <if> | <let>
<form> -> <exp>+
<define> -> ’define’ <variable> <exp>
<lambda> -> ’lambda’ ’(’ <variable>* ’)’ <exp>+
<quote> -> ’quote’ <variable>
<cond> -> ’cond’ <condition-clause>* <else-clause>
<condition-clause> -> ’(’ <exp> <exp>+ ’)’
<else-clause> -> ’(’ ’else’ <exp>+ ’)’
<if> -> ’if’ <exp> <exp> <exp>
<let> -> ’let’ ’(’ <var-initialization>* ’)’ <exp>+
ממשי תחביר
1שאלה :- ל הדומה ביטוי לשפה להוסיף אבל, ifנרצה: , כך שייראה האלטרנטיבה בלי
( when pred-exp cons-exps)
:דוגמאות((when (> x 5) (+ x 3)
(when (> x 5) (display x) (* x x))
? בתחביר לעשות צריך שינויים אילו
מופשט ותחביר ממשי תחביר
<scheme-exp>:
Kinds: <exp>, <define>
<exp>:
Kinds: <atomic>, <composite>
<composite>:
Kinds: <special>, <form>
<special>:
Kinds: <lambda>, <quote>, <cond>, <if>
<when>:
Components: Test: <exp>
Body: <exp>+ Amount: >=1. Ordered
מופשט תחביר
,<when>
<scheme-exp> -> <exp> | ’(’ <define> ’)’
<exp> -> <atomic> | ’(’ <composite> ’)’
<composite> -> <special> | <form>
<special> -> <lambda> | <quote> | <cond> | <if> | <let>
<if> -> ’if’ <exp> <exp> <exp>
<when> -> ‘when’ <exp> <exp>+
ממשי תחביר
|<when>
ה : 2שאלה שהתחביר בהגדרת ממשיראינו תומך: הבא באופן משתנה
<define> -> ‘define’ <variable> <exp>
להגדיר אפשרות להוסיף נרצה אם התחביר ישתנה איך : כך ?( x is 3)משתנה
:ה התחביר :ממשיתשובה כך ישתנה<define> -> ‘define’ <variable> <exp>
מופשט ותחביר ממשי תחביר
< |variable> ‘is‘ <exp>
רק
!
- ב ביטויים להערכת פונקציות :Schemeשתיapplicative-eval(e)
eval-substitute-reducenormal-eval(e)
substitute-reduce
חישוב שיטות
קושר לכל : 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))))
חישוב שיטות
5שאלה . צריך: למה הבא הקוד בקטע התבוננו?renamingלבצע
>(define z not)
>(((lambda (x)(lambda (z) (x z)))
(lambda (w) (z w))) #f)
Renaming & Substitution
>(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)
6שאלה:
applicative-eval [ ((lambda (x z) (* (+ x z) z)) 1 (+ 1 2) ) ]
applicative-eval [ (lambda (x z) (* (+ x z) z)) ] ==>
<Closure (x z) (* (+ x z) z)>
applicative-eval [1] ==> 1
applicative-eval [(+ 1 2)]
applicative-eval [+] ==> #<primitive-procedure +>
applicative-eval [1] ==> 1
applicative-eval [2] ==> 2
==>3
חישוב שיטות
(* (+ x z) z) {x = 1} ==> (* (+ 1 z) z) (* (+ 1 z) z) {z = 3} ==> (* (+ 1 3) 3) reduce: applicative-eval [(* (+ 1 3) 3)] applicative-eval [*] ==> #<primitive-procedure *>
applicative-eval [(+ 1 3)] applicative-eval [+] ==> #<primitive-procedure
+> applicative-eval [1] ==> 1 applicative-eval [3] ==> 3
==> 4 applicative-eval [3]==> 3
==> 12
חישוב שיטות
7שאלה: הבא: הקוד בקטע התבוננו>(define loop (lambda (x) (loop x)))>(define g (lambda (x y) y))
מה יקרה לאחר הפעלת השורה הבאה לפי כלאחת משיטות החישוב?
>(g (loop 0) 7)
חישוב שיטות
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)( בשני האלגוריתמים?
חישוב שיטות
>(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]==> <closure (lambda (x y) (if (= x 0) 0
y))>
(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[ = ] ==>#<primitive-procedure
=>
normal-eval[ 0 ] ==>0
normal-eval[ 0 ] ==>0
==> #t
normal-eval[0] ==> 0
==>0לפי מחשבים היינו אם קורה היה ??applicative-evalמה
עובר: 9שאלה שיטה איזו לפי לדעת אפשר איךהאינטרפרטר?
>(define f(lambda(x) 1)
>(define g (lambda (x) 2)
אם איןside-effects נקבל רק את הערך שיוחזר מחישוב הביטוי, וערך זה הוא תמיד זהה בהנחה
שהחישוב מסתיים בשתי השיטות.
...side-effectsאז ניצור
חישוב שיטות
עובד: 9שאלה שיטה איזו לפי לדעת אפשר איךהאינטרפרטר?
> (define normal (lambda () (display 'applicative) 0 ))> (define test (lambda(x) 1))> (test (normal))
Applicative: ‘applicative 1Normal: 1
חישוב שיטות
שראינו: 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 ?
חישוב שיטות
: מחדש ניסוח(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))))
?..מה עוד אפשר לשפר
חישוב שיטות