EuLisp

**EuLisp** היא שפת תכנות ממשפחת שפות Lisp אשר שוחררה לראשונה בשנת 1990. מטרות השפה היו ליצור ניב Lisp אשר פחות מושפע מן גרסאות העבר של Lisp (בניגוד ל-Common Lisp) אך לא מינימליסטי כמו Scheme, וכן לשלב תכנות מונחה עצמים. השפה נוצרה על ידי מתכנתים ומשתמשי Lisp אקדמאיים ברחבי אירופה. EuLisp היא שפת תכנות מרובת פרדיגמות- כלומר, היא תומכת במספר עקרונות תכנותיים (תכנות פונקציונלי, תכנות פרוצדורלי, מטא תכנות, תכנות מונחה עצמים). ל-EuLisp יש טיפוסיות דינמית וסטטית.

## פרדיגמות תכנות
EuLisp היא שפת תכנות מרובת פרדיגמות, להלן פרדיגמות התכנות בהן היא תומכת:

* **תכנות פונקציונלי** - תכנות פונקציונלי שם דגש על קריאה לפעולות ופישוטן כביטויים.
* **תכנות מונחה עצמים** - בתכנות מונחה עצמים, ניצור מחלקות ואובייקטים על מנת לייצג מידע שלא ניתן, או לא יעיל לייצגו באמצעות סוגי מידע פרימטיבים ( int, double, וכו'). לדוגמה, אדם מכיל תכונות רבות: שם, גובה, משקל, ועוד. לפיכך לא ניתן לתאר אדם באמצעות סוג משתנה פרימיטבי.
* **תכנות פרוצדורלי** - בתכנות פרוצדורלי, כל תוכנית מחולקת לתת תוכניות הנקראות פרוצדורות (שגרות) .

**מטא תכנות -** בפרדיגמה זו, ניתן ״לשכתב את השפה״, כלומר, לשנות ערכים ופעולות אשר מוגדרים בשפה.

## דוגמאות קוד
שימוש במחלקות על מנת לפתור את בעיית ״מגדלי האנוי״:
```lisp
(defmodule hanoi
 (syntax (syntax-0)
 import (level-0)
 export (hanoi))

;;;-------------------------------------------------
;;; Tower definition
;;;-------------------------------------------------
(defconstant *max-tower-height* 10)

(defclass <tower> ()
 ((id reader: tower-id keyword: id:)
 (blocks accessor: tower-blocks)))

(defun build-tower (x n)
 (labels ((loop (i res)
 (if (= i 0) res
 (loop (- i 1) (cons i res)))))
 ((setter tower-blocks) x (loop n ()))
 x))

(defmethod generic-print ((x <tower>) (s <stream>))
 (sformat s "#<tower ~a: ~a>" (tower-id x) (tower-blocks x)))

;;;-------------------------------------------------
;;; Access to tower blocks
;;;-------------------------------------------------
(defgeneric push (x y))

(defmethod push ((x <tower>) (y <fpi>))
 (let ((blocks (tower-blocks x)))
 (if (or (null? blocks) (< y (car blocks)))
 ((setter tower-blocks) x (cons y blocks))
 (error <condition>
 (fmt "cannot push block of size ~a on tower ~a" y x)))))

(defgeneric pop (x))

(defmethod pop ((x <tower>))
 (let ((blocks (tower-blocks x)))
 (if blocks
 (progn
 ((setter tower-blocks) x (cdr blocks))
 (car blocks))
 (error <condition>
 (fmt "cannot pop block from empty tower ~a" x)))))

;;;-------------------------------------------------
;;; Move n blocks from tower x1 to tower x2 using x3 as buffer
;;;-------------------------------------------------
(defgeneric move (n x1 x2 x3))

(defmethod move ((n <fpi>) (x1 <tower>) (x2 <tower>) (x3 <tower>))
 (if (= n 1)
 (progn
 (push x2 (pop x1))
 (print x1 nl x2 nl x3 nl nl))
 (progn
 (move (- n 1) x1 x3 x2)
 (move 1 x1 x2 x3)
 (move (- n 1) x3 x2 x1))))

;;;-------------------------------------------------
;;; Initialize and run the 'Towers of Hanoi'
;;;-------------------------------------------------
(defun hanoi ()
 (let ((x1 (make <tower> id: 0))
 (x2 (make <tower> id: 1))
 (x3 (make <tower> id: 2)))
 (build-tower x1 *max-tower-height*)
 (build-tower x2 0)
 (build-tower x3 0)
 (print x1 nl x2 nl x3 nl nl)
 (move *max-tower-height* x1 x2 x3)))

(hanoi)

;;;-------------------------------------------------
) ;; End of module hanoi
;;;-------------------------------------------------
```


## ראו גם
* Lisp
* Common Lisp
* Scheme
* תכנות פונקציונלי
* תכנות מונחה-עצמים

## קישורים חיצוניים

* EuLisp ב-GitHub
* "An Overview of EuLisp", Julian Padget, Greg Nuyens, and Harry Bretthauer, editors. *Lisp and Symbolic Computation*, Volume 6, Number 1-2, 1993, pages 9–98.
* "Balancing the EuLisp Metaobject Protocol", Harry Bretthauer, Jürgen Kopp, Harley Davis, and Keith Playford. *Lisp and Symbolic Computation*, Volume 6, Issue 1-2, August 1993, pages 119-138.
* "EuLisp in Education", R. Bradford and D.C. DeRoure. *Lisp and Symbolic Computation*, Volume 6, Number 1-2, pages 99–118.
* "Applications of Telos", Peter Broadbery, Christopher Burdorf. *Lisp and Symbolic Computation*, Volume 6, Issue 1-2, August 1993, pages 139-158.
* "A Practical Approach to Type Inference for EuLisp", Andreas Kind and Horst Friedrich. *Lisp and Symbolic Computation*, Volume 6, Issue 1-2, August 1993, pages 159-176.
* "EuLisp Threads: A Concurrency Toolbox", Neil Berrington, Peter Broadbery, David DeRoure, and Julian Padget. *Lisp and Symbolic Computation*, Volume 6, Issue 1-2, August 1993, pages 177-200.
* "Plural EuLisp: A Primitive Symbolic Data Parallel Model" Simon Merrall, Julian Padget. *Lisp and Symbolic Computation*, Volume 6, Issue 1-2, August 1993, pages 201-219.
* "A Conservative Garbage Collector for an EuLisp to ASM/C Compiler", E. Ulrich Kriegel. *OOPSLA'93 Workshop on Garbage Collection and Memory Management*, Washington, DC, September 27, 1993.
* "An Implementation of Telos in Common Lisp", *Object Oriented Systems*, vol. 3, pp. 31–49, 1996. ISSN 0969-9767.


קטגוריה:תוכנה
קטגוריה:תכנות
קטגוריה:תכנות מונחה-עצמים