practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי...

20
Principles of Programming Languages Practice session 3 )יייייייי( יייייי ייייי)ייייייי( ייייי יייי ייייי ייייי:Applicative & Normal Evaluation Partial Evaluation

Upload: jeffry-jacobs

Post on 04-Jan-2016

222 views

Category:

Documents


8 download

TRANSCRIPT

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

Principles of Programming

Languages Practice session 3

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

Page 2: 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…

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

<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>+

ממשי תחביר

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

1שאלה :- ל הדומה ביטוי לשפה להוסיף אבל, ifנרצה: , כך שייראה האלטרנטיבה בלי

( when pred-exp cons-exps)

:דוגמאות((when (> x 5) (+ x 3)

(when (> x 5) (display x) (* x x))

? בתחביר לעשות צריך שינויים אילו

מופשט ותחביר ממשי תחביר

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

<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>

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

<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>

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

ה : 2שאלה שהתחביר בהגדרת ממשיראינו תומך: הבא באופן משתנה

<define> -> ‘define’ <variable> <exp>

להגדיר אפשרות להוסיף נרצה אם התחביר ישתנה איך : כך ?( x is 3)משתנה

:ה התחביר :ממשיתשובה כך ישתנה<define> -> ‘define’ <variable> <exp>

מופשט ותחביר ממשי תחביר

< |variable> ‘is‘ <exp>

רק

!

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

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

eval-substitute-reducenormal-eval(e)

substitute-reduce

חישוב שיטות

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

קושר לכל : 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))))

חישוב שיטות

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

5שאלה . צריך: למה הבא הקוד בקטע התבוננו?renamingלבצע

>(define z not)

>(((lambda (x)(lambda (z) (x z)))

(lambda (w) (z w))) #f)

Renaming & Substitution

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

>(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)

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

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

חישוב שיטות

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

(* (+ 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

חישוב שיטות

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

7שאלה: הבא: הקוד בקטע התבוננו>(define loop (lambda (x) (loop x)))>(define g (lambda (x y) y))

מה יקרה לאחר הפעלת השורה הבאה לפי כלאחת משיטות החישוב?

>(g (loop 0) 7)

חישוב שיטות

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

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)( בשני האלגוריתמים?

חישוב שיטות

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

>(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מה

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

עובר: 9שאלה שיטה איזו לפי לדעת אפשר איךהאינטרפרטר?

>(define f(lambda(x) 1)

>(define g (lambda (x) 2)

אם איןside-effects נקבל רק את הערך שיוחזר מחישוב הביטוי, וערך זה הוא תמיד זהה בהנחה

שהחישוב מסתיים בשתי השיטות.

...side-effectsאז ניצור

חישוב שיטות

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

עובד: 9שאלה שיטה איזו לפי לדעת אפשר איךהאינטרפרטר?

> (define normal (lambda () (display 'applicative) 0 ))> (define test (lambda(x) 1))> (test (normal))

Applicative: ‘applicative 1Normal: 1

חישוב שיטות

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

שראינו: 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 ?

 

חישוב שיטות

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

: מחדש ניסוח(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))))

 ?..מה עוד אפשר לשפר

חישוב שיטות