10.07.2015 Views

An Introduction to Functional Programming Through Lambda Calculus

An Introduction to Functional Programming Through Lambda Calculus

An Introduction to Functional Programming Through Lambda Calculus

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

- 204 -(op (car (cdr l)))(e2 (trans (car (cdr (cdr l))))))(list op e1 e2))))For example:(trans ’(1 + 2)) ->(+ 1 2)(trans ’(3 * (4 * 5))) ->(* 3 (* 4 5))(trans ’((6 * 7) + (8 - 9))) ->(+ (* 6 7) (- 8 9))Note that quoted symbols for infix opera<strong>to</strong>rs have been moved in<strong>to</strong> the function positions in the resultant forms.Now, we can evaluate the translated expression, as a LISP form, using eval:(defun calc (l)(eval (trans l)))For example:(calc ’((6 * 7) + (8 - 9))) ->41The treatment of free variables in quoted forms depends on the scope rules. For dynamic scope systems, quoted freevariables are associated with the corresponding bound variable when the quoted form is evaluated. Thus, withdynamic scope, quoting can move free variables in<strong>to</strong> different evaluation scopes.In COMMON LISP, with lexical scope, quoted free variables are not associated with bound variables in the definingscope as might be expected. Instead, they are evaluated as if there were no bound variables defined apart from thenames from global definitions.10.18. λ calculus in LISPWe can use function and funcall for rather clumsy applicative order pure λ calculus. For example, we can tryout some of the λ functions we met in chapter 2. First of all, we can apply the identity function:<strong>to</strong> itself:#’(lambda (x) x)(funcall #’(lambda (x) x) #’(lambda (x) x))Note that some LISP implementations will not print out the resultant function and others will print a system sepecificrepresentation.Let us now use definitions:(defun identity (x) x) ->identity(funcall #’identity #’identity)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!