Автор Тема: Пробуем писать на O7  (Прочитано 26255 раз)

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #45 : Август 30, 2013, 10:58:19 pm »
Вот он минимализм. В процессорах начиная с pentium появилась технология предвыборка данных.

http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_%D0%BA%D0%BE%D0%B4%D0%B0
Во-первых, это предвыборка кода, а во-вторых, на Яве есть сторонняя библиотека (называется как-то типа Ropes), производительность которой выше, чем над стандартными строками именно потому, что внутреннее представление строк там в виде дерева (вроде) из подстрок (возможно, даже, массивов).

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #46 : Август 31, 2013, 12:34:51 pm »
Слишком низкоуровневым язык получился. ИМХО.
Смотря где его применять. Для ПЛИС, например, вполне нормально.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #47 : Сентябрь 06, 2013, 05:18:23 pm »
Такс. Набросал пример решения (не претендуя на алгоритмическую гениальность и кошерность циклов) с применением прототипа макета черновика стандартной либы :-)

(поскольку это прототип, погонять в онлайн-компиляторе пока не выйдет)

Да, для полноты картины я реализовал обе фунции - и ту которая создает входные данные и ту которая уже слепливает "массивы" в один с разделителями.

MODULE VladQuest;

  IMPORT VectorInt, ArrayInt;

  PROCEDURE Merge(input: ARRAY OF VectorInt.T; separator: INTEGER) : VectorInt.T;
  VAR
    res : VectorInt.T;
    i,j : INTEGER;
  BEGIN
    res := VectorInt.Create;
    FOR i:=0 TO LEN(input) DO
      FOR j:=0 TO VectorInt.Len(input[i]) DO
        VectorInt.PushBack(res,VectorInt.Get(input[i],j))
      END;
      VectorInt.PushBack(res, separator)
    END
    VectorInt.PopBack(res);
    RETURN res
  END Merge;

  PROCEDURE Test;
  VAR
    input : ARRAY 2 OF ArrayInt.T;
  BEGIN
    ArrayInt.Fill2(input,
                   VectorInt.Make3(1,2,3),
                   VectorInt.Make2(4,5));
    Merge(input, 10);
  END Test; 

END VladQuest.

Возможен вопрос - а что если мне не нравятся такие длиные имена у функций (VectorInt.PusgBack), что если хочется короче и лаконичней? Не проблема, можно сделать псевдонимы (хотя возможность именно такого рода псевдонимов, удобный таких, прямо сейчас горячо обсуждается в конфе :-) ):
MODULE VladQuest;

  IMPORT VectorInt, ArrayInt;

  CONST
    Create   = VectorInt.Create;
    Len      = VectorInt.Len;
    PushBack = VectorInt.PushBack;
    PopBack  = VectorInt.PopBack;
    Get      = VectorInt.Get;
    Make3    = VectorInt.Make3;
    Make2    = VectorInt.Make2;

    Fill2 = ArrayInt.Fill2;

  PROCEDURE Merge(input: ARRAY OF VectorInt.T; separator: INTEGER) : VectorInt.T;
  VAR
    res : VectorInt.T;
    i,j : INTEGER;
  BEGIN
    res := Create;
    FOR i:=0 TO LEN(input) DO
      FOR j:=0 TO Len(input[i]) DO
        PushBack(res,Get(input[i],j))
      END;
      PushBack(res, separator)
    END
    PopBack(res);
    RETURN res
  END Merge;

  PROCEDURE Test;
  VAR
    input : ARRAY 2 OF ArrayInt.T;
  BEGIN
    ArrayInt.Fill2(input,
                   Make3(1,2,3),
                   Make2(4,5));
    Merge(input, 10);
  END Test; 

END VladQuest.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #48 : Сентябрь 06, 2013, 05:30:37 pm »
Так. Налажал таки. IMPORT ArrayInt следует заменить на IMPORT ArrayVectorInt;

Ну и соответственно ArrayInt.Fill2 на ArrayVectorInt.Fill2
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #49 : Сентябрь 06, 2013, 06:11:42 pm »
Для контраста питоновский вариант:
a = [[1, 2, 3], [4,5]]
sep = 10
reduce(lambda x, y: x + [sep] + y, a)

Выводит:
Цитировать
[1, 2, 3, 10, 4, 5]

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #50 : Сентябрь 07, 2013, 06:41:39 pm »
  CONST
    Create   = VectorInt.Create;
    Len      = VectorInt.Len;
    PushBack = VectorInt.PushBack;
    PopBack  = VectorInt.PopBack;
    Get      = VectorInt.Get;
    Make3    = VectorInt.Make3;
    Make2    = VectorInt.Make2;

Мне не кажется это хорошим решением. Псевдонимы нужны не только для процедур, но и для переменных и типов. Объявление CONST будет выглядеть странно (даже если формально (!) это не противоречит репорту). Если уж расширять язык, то лучше, наверное, разделить объявление собственно констант и псевдонимов. Может быть так:

MODULE Foo;
IMPORT Out;

ALIAS
  outs = Out.String;
...

CONST
...
TYPE
...
VAR
...
BEGIN
...
END Foo.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #51 : Сентябрь 07, 2013, 06:53:41 pm »
  CONST
    Create   = VectorInt.Create;
    Len      = VectorInt.Len;
    PushBack = VectorInt.PushBack;
    PopBack  = VectorInt.PopBack;
    Get      = VectorInt.Get;
    Make3    = VectorInt.Make3;
    Make2    = VectorInt.Make2;

Мне не кажется это хорошим решением. Псевдонимы нужны не только для процедур, но и для переменных и типов. Объявление CONST будет выглядеть странно (даже если формально (!) это не противоречит репорту). Если уж расширять язык, то лучше, наверное, разделить объявление собственно констант и псевдонимов. Может быть так:

MODULE Foo;
IMPORT Out;

ALIAS
  outs = Out.String;
...

CONST
...
TYPE
...
VAR
...
BEGIN
...
END Foo.
Штука в том, что я не собираюсь расширять язык. Зачем его расширять, если там все есть и так? :-)

Вообще, с константами в Обероне большая беда. Там это весьма мутное понятие. И это предмет отдельного разговора, чтобы договориться и уточнить что под этим подразумевается.
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: Пробуем писать на O7
« Ответ #52 : Сентябрь 07, 2013, 06:55:53 pm »
зачем? чем это лучше, c точки зрения наглядности:
IMPORT
OutS:=Out.String,
...

DddIzer

  • Гость
Re: Пробуем писать на O7
« Ответ #53 : Сентябрь 07, 2013, 06:57:16 pm »
Вообще, с константами в Обероне большая беда. Там это весьма мутное понятие. И это предмет отдельного разговора, чтобы договориться и уточнить что под этим подразумевается.
то что вы предлагаете ясности не привносит, по - любому.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #54 : Сентябрь 07, 2013, 07:18:23 pm »
зачем? чем это лучше, c точки зрения наглядности:
IMPORT
OutS:=Out.String,
...
Это ж не валидная конструкция в Обероне.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #55 : Сентябрь 07, 2013, 07:21:02 pm »
Вообще, с константами в Обероне большая беда. Там это весьма мутное понятие. И это предмет отдельного разговора, чтобы договориться и уточнить что под этим подразумевается.
то что вы предлагаете ясности не привносит, по - любому.
Я предлагаю лишь обсудить, и показываю варианты толкования.
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: Пробуем писать на O7
« Ответ #56 : Сентябрь 07, 2013, 07:55:52 pm »
зачем? чем это лучше, c точки зрения наглядности:
IMPORT
OutS:=Out.String,
...
Это ж не валидная конструкция в Обероне.
почему, просто это работает только для модулей (вообще говоря, я комментировал предложение Акрона по поводу добавления секции ALIAS  - c точки зрения репорта она один черт невалидна - просто вы успели вставить сообщение раньше).

DddIzer

  • Гость
Re: Пробуем писать на O7
« Ответ #57 : Сентябрь 07, 2013, 07:59:36 pm »
т.е.  просто расширение предполагает возможность создания псевдонима на любую импортируемую сущность (а не только модули)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #58 : Сентябрь 08, 2013, 04:05:17 am »
Как уже предлагал в конференции, сделать по типу Модулы-3:
FROM ModuleName IMPORT X, Y, Z, P := Proc, P1 := Proc1;

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #59 : Сентябрь 08, 2013, 04:10:15 am »
Но вообще, лично я предпочитаю видеть квалификатор модуля в имени переменной/процедуры, потому что сразу понятно, что это и зачем.