EuLisp
מראה
יש לשכתב ערך זה. ייתכן שהערך מכיל טעויות, או שהניסוח וצורת הכתיבה שלו אינם מתאימים. | |
פרדיגמות | תכנות פונקציונלי, תכנות פרוצדורלי, תכנות מונחה עצמים, מטא תכנות |
---|---|
תאריך השקה | 1990 |
גרסה אחרונה | 0.991 (2010) |
מימושים | 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, וכו'). לדוגמה, אדם מכיל תכונות רבות: שם, גובה, משקל, ועוד. לפיכך לא ניתן לתאר אדם באמצעות סוג משתנה פרימיטבי.
- תכנות פרוצדורלי - בתכנות פרוצדורלי, כל תוכנית מחולקת לתת תוכניות הנקראות פרוצדורות (שגרות) .
מטא תכנות - בפרדיגמה זו, ניתן ״לשכתב את השפה״, כלומר, לשנות ערכים ופעולות אשר מוגדרים בשפה.
דוגמאות קוד
[עריכת קוד מקור | עריכה]שימוש במחלקות על מנת לפתור את בעיית ״מגדלי האנוי״:
(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
;;;-------------------------------------------------
ראו גם
[עריכת קוד מקור | עריכה]קישורים חיצוניים
[עריכת קוד מקור | עריכה]- 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.