Автор Тема: Elena (язык программирования)  (Прочитано 3786 раз)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Elena (язык программирования)
« : Апрель 28, 2013, 11:23:35 am »
Проект - Язык программирования 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.
].

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Elena (язык программирования)
« Ответ #1 : Апрель 28, 2013, 11:42:08 am »
Судя по синтаксису - что-то самобытное. Да и семантика заявлена интересная. Надо глянуть.
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: Elena (язык программирования)
« Ответ #2 : Апрель 28, 2013, 02:01:55 pm »
Судя по синтаксису - что-то самобытное. Да и семантика заявлена интересная. Надо глянуть.
вопрос зачем? ибо выглядит достаточно страшно (смолтолк на си++ подобным синтаксисе ) на первый взгляд... да и на второй тоже..

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Elena (язык программирования)
« Ответ #3 : Апрель 28, 2013, 02:50:08 pm »
Судя по синтаксису - что-то самобытное. Да и семантика заявлена интересная. Надо глянуть.
вопрос зачем? ибо выглядит достаточно страшно (смолтолк на си++ подобным синтаксисе ) на первый взгляд... да и на второй тоже..
Для интереса. Не использовать же его на самом деле :-)
Y = λf.(λx.f (x x)) (λx.f (x x))