EuLisp

שפת תכנות
יש לשכתב ערך זה. ייתכן שהערך מכיל טעויות, או שהניסוח וצורת הכתיבה שלו אינם מתאימים.
אתם מוזמנים לסייע ולתקן את הבעיות, אך אנא אל תורידו את ההודעה כל עוד לא תוקן הדף. אם אתם סבורים כי אין בדף בעיה, ניתן לציין זאת בדף השיחה.

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

EuLisp
EuLispLogo.png
פרדיגמות תכנות פונקציונלי, תכנות פרוצדורלי, תכנות מונחה עצמים, מטא תכנות
שנה 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 היא שפת תכנות מרובת פרדיגמות, להלן פרדיגמות התכנות בהן היא תומכת:

  • תכנות פונקציונלי - תכנות פונקציונלי שם דגש על קריאה לפעולות ופישוטן כביטויים.
  • תכנות מונחה עצמים - בתכנות מונחה עצמים, ניצור מחלקות ואובייקטים על מנת לייצג מידע שלא ניתן, או לא יעיל לייצגו באמצעות סוגי מידע פרימטיבים ( 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
;;;-------------------------------------------------

ראו גםעריכה

קישורים חיצונייםעריכה

  ערך זה הוא קצרמר בנושא תוכנה. אתם מוזמנים לתרום לוויקיפדיה ולהרחיב אותו.