EuLisp
![]() |
||
יש לשכתב ערך זה. ייתכן שהערך מכיל טעויות, או שהניסוח וצורת הכתיבה שלו אינם מתאימים. | |
פרדיגמות | תכנות פונקציונלי, תכנות פרוצדורלי, תכנות מונחה עצמים, מטא תכנות |
---|---|
מימושים | EuXLisp, Youtoo, Eu2C |
הושפעה על ידי | Common Lisp, InterLisp, Le Lisp, Scheme, Haskell, CLOS, MCS, Lisp/VM, MicroCeyx, ObjVlisp Oaklisp, |
השפיעה על | Dylan, ISLISP, Evelin |
סיומת | em. |
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>
ראו גם
קישורים חיצוניים
- 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.