Проект - Язык программирования ELENA версия 1.5.6
(C)2005-2010 Алексей Раков
Проект ELENA включает в себя документацию (пока только на английском),
библиотеку классов, примеры, компилятор командной строки, интегрированную среду разработки (IDE).
В настоящий момент поддерживается только платформа Win32-x86 (2000/XP/Vista/7).
За дополнительной информацией обращайтесь на
http://elenalang.sourceforge.net/****************************************************************************
* Некоторые характеристики проекта
****************************************************************************
- Динамический объектно-ориенированный язык программирования
- "Горизонтальное" множественное наследование
- Изменчивое поведение объектов ("shift" технология)
- Поддержка динамических изменений классов по ходу работы программы (мутации)
("annex / cast" обработчики)
- Виртуальная машина ELENAVM (в разработке)
- 32-x битный компилятор коммандной строки
- Графическая среда разработки и отладчик
- Поддержка уникода (unicode)
- Исходные коды
- Примеры, включая карточную игру Up'N'Down (в разработке)
- Ряд учебных материалов для начинающих
- Упращенный Ассемблер компилятор
****************************************************************************
* Минимальные требования
****************************************************************************
x86 процессор,
Win32:
- Win2000/XP/Vista
- 16 MB оперативной памяти
****************************************************************************
* Лицензия
****************************************************************************
The compiler and executables distributed in this package fall under The Apache
License V2.0e, for more information read the file LICENSE.TXT.
Пример кода
// based on http://cboard.cprogramming.com/cplusplus-programming/30001-determinant-calculation.html prelude sample
// --- default namespaces ---
#define std'dictionary'*.
#define std'basic'*.
#define std'patterns'*.
#define std'math'matrix'*.
#define ext'io'*.
#define ext'patterns'*.
// --- namespace shortcuts ---
#define factory'* = std'basic'factory'*.
// --- private subjects ---
#subject matrix_name, determinant.
// --- factory ---
#symbol NewMatrix : Args =
NewInitializedArray &&m:(Args m) &n:(Args n) &factory'init_action: anItem =>
[
^ (console << "Enter " << Args matrix_name << "[" << anItem m + 1 << "," << anItem n + 1 << "]=" >> Real).
].
// --- matrix role ---
#role EMatrix
{
#method + aMatrix
[
#var aCount := self count.
^ NewInitializedArray &&m:aCount &n:aCount &factory'init_action: anItem =>
(self @ anItem m @ anItem n + aMatrix @ anItem m @ anItem n).
]
#method - aMatrix
[
#var aCount := self count.
^ NewInitializedArray &&m:aCount &n:aCount &factory'init_action: anItem =>
(self @ anItem m @ anItem n - aMatrix @ anItem m @ anItem n).
]
#method * aMatrix
[
#var aCount := self count.
#var aResult := NewInitializedArray &&m:aCount &n:aCount &factory'pattern:(real::0).
loop &&for:0 &till:aCount run: i =>
[
loop &&for:i &till:aCount run: j =>
[
loop &&for:j &till:aCount run: k =>
[
aResult@i@j += (self@i@k * aMatrix@k@j).
].
].
].
^aResult.
]
#method determinant
[
#var aCount := self count.
// create matrix copy
#var a := NewInitializedArray &&m:aCount &n:aCount &factory'init_action:anItem => (real::(self @ anItem m @ anItem n)).
#var deter := real << 1.
#if loop &&for:0 &till:aCount run: k =>
[
#if (a@k@k == 0.0r)?
[
control ifnot:(0.0r == Summing::Real::0 start:(loop &&for:k &till:aCount)).
loop &&for:k &till:aCount run: j =>
[
loop &&for:k &till:aCount run: i =>
[
#var temp := real::(a@j@i).
a@j@i << a@k@i.
a@k@i << temp.
].
].
deter *= -1.
].
deter *= a@k@k.
loop &&for:(k + 1) &till:aCount run: i =>
[
loop &&for:(k + 1) &till:aCount run: j =>
[
a@i@j -= (a@i@k * a@k@j / a@k@k).
].
].
]
[
^ deter.
]
| [
^ 0.0r.
].
]
#method literal_writer'save : aWriter
[
Scan::self run: aRow =>
[
Scan::aRow run:ListSaving::aWriter.
aWriter << "%n".
].
^ aWriter.
]
}
#symbol IdentityMatrix : anOrder
= NewInitializedArray
&&m:anOrder
&n:anOrder
&factory'init_action:aCell =>
[
^ Control if:(aCell m == aCell n) back:real::1 | back:real::0.
].
// ---- Program ---
#symbol Program =>
[
'program'output << "Choose an option%n".
'program'output << "[1] - Sum Matrix%n[2] - Subtract Matrix%n[3] - Multiply Matrix%n[4] - Matrix Determinant%n".
'program'output << "[5] - Identity Matrix%nYour choice: ".
#var aChoice := 'program'input >> integer.
'program'output << "Enter the order of matrix: ".
#var N := 'program'input >> integer.
#if aChoice == 1?
[
#var aMatrixA := NewMatrix &&m:N &n:N &matrix_name:"A".
'program'output << "%n".
#var aMatrixB := NewMatrix &&m:N &n:N &matrix_name:"B".
#var aSum := aMatrixA~ematrix + aMatrixB.
'program'output << __wrap(ematrix, aSum).
]
| == 2?
[
#var aMatrixA := NewMatrix &&m:N &n:N &matrix_name:"A".
'program'output << "%n".
#var aMatrixB := NewMatrix &&m:N &n:N &matrix_name:"B".
'program'output << "%n".
#var aDiff := aMatrixA~ematrix - aMatrixB.
'program'output << __wrap(ematrix, aDiff).
]
| == 3?
[
#var aMatrixA := NewMatrix &&m:N &n:N &matrix_name:"A".
'program'output << "%n".
#var aMatrixB := NewMatrix &&m:N &n:N &matrix_name:"B".
'program'output << "%n".
#var aMul := aMatrixA~ematrix * aMatrixB.
'program'output << __wrap(ematrix, aMul).
]
| == 4?
[
#var aMatrixA := NewMatrix &&m:N &n:N &matrix_name:"A".
#var aDeterminant := aMatrixA~ematrix determinant.
'program'output << "%n%n" << aDeterminant.
]
| == 5?
[
#var identity := IdentityMatrix::N.
'program'output << __wrap(ematrix, identity).
].
'program'input get.
].