EuLisp

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

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

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

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

== דוגמאות קוד ==
שימוש במחלקות על מנת לפתור את בעיית ״מגדלי האנוי״:<syntaxhighlight lang="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
;;;-------------------------------------------------
</syntaxhighlight>

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

== קישורים חיצוניים ==
<div class="mw-content-ltr">
* [https://henry.github.com/EuLisp/Doc/EuLisp-0.991/eulisp.pdf EuLisp] ב-GitHub
* "[http://www.softwarepreservation.org/projects/LISP/eulisp/paper/overview.pdf 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.
* "[http://www.softwarepreservation.org/projects/LISP/eulisp/paper/mop.pdf 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.
* "[http://www.softwarepreservation.org/projects/LISP/eulisp/paper/teach.pdf EuLisp in Education]", R. Bradford and D.C. DeRoure. Lisp and Symbolic Computation, Volume 6, Number 1-2, pages 99–118.
* "[http://www.softwarepreservation.org/projects/LISP/eulisp/paper/applic.pdf Applications of Telos]", Peter Broadbery, Christopher Burdorf. Lisp and Symbolic Computation, Volume 6, Issue 1-2, August 1993, pages 139-158.
* "[http://www.softwarepreservation.org/projects/LISP/eulisp/paper/infer.pdf 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.
* "[http://www.softwarepreservation.org/projects/LISP/eulisp/paper/threads.pdf 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.
* "[http://www.softwarepreservation.org/projects/LISP/eulisp/paper/plural.pdf 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.
* "[http://www.softwarepreservation.org/projects/LISP/eulisp/paper/kriegel93conservative.pdf 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.
* "[http://www.bath.ac.uk/~masrjb/Papers/teloscl.dvi.gz An Implementation of Telos in Common Lisp]", Object Oriented Systems, vol. 3, pp. 31–49, 1996. ISSN 0969-9767.
</div>

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