EuLisp

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

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

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

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

 דוגמאות קוד 
שימוש במחלקות על מנת לפתור את בעיית ״מגדלי האנוי״:(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.

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