четверг, 22 июня 2017 г.

ToDo

Try..finally..end заменить на:

Try_finally ( a ) ( b )
Try_except ( a ) ( b )

И пихать begin в поток токенов.

Чтобы try a finally b end разворачивалось в:

Try_finally begin a end begin b end

Ну и try a except b end соответственно:

Try_except begin a end begin b end

Убрать FirstHalf и DualCompilingWord.

39 комментариев:

  1. Планируется развитие языка во что-то подобное lua? Или это локальная разработка?

    ОтветитьУдалить
    Ответы
    1. Планируется. Есть консольная запускалка. Есть возможность подключать к проектам на Delphi.

      И по сути это не совсем скрипты. А машинка для описания собственных грамматик.

      Как для кода, так и для данных.

      Удалить
    2. Для описания грамматик? Это как? Вообще интересно.

      Удалить
    3. Ну минимальная автоматика с возможностью оперировать потоком токенов. И возможностью на основе аксиоматики строить другие конструкции и менять правила разбора.

      Внутри стэковая машина.

      Удалить
    4. Ну и помимо собственно аксиоматики есть возможность экспортировать в машинку словари-обёртки над кодом из дельфи. Сейчас туда вытащен почти весь rtl/vcl.

      Ну и масса своих объектов и интерфейсов.

      Но это уже не аксиоматика, а "батарейки".

      Удалить
    5. Ну и помимо собственно аксиоматики есть возможность экспортировать в машинку словари-обёртки над кодом из дельфи. Сейчас туда вытащен почти весь rtl/vcl.

      Ну и масса своих объектов и интерфейсов.

      Но это уже не аксиоматика, а "батарейки".

      Удалить
    6. Я писал уже несколько статей про устройство.

      Могу попробовать написать ещё.

      Удалить
  2. И есть репозитарий gut с примерами.

    ОтветитьУдалить
    Ответы
    1. Буду за компьютером - накидаю ссылок.

      Удалить
    2. В отличии от питона это компилятор, а не интерпретатор.

      Также есть rtti и рефлексия.

      А также функциональные штучки типа map/reduce. И кеширования результатов вычисления.

      Удалить
    3. https://bitbucket.org/lulinalex/mindstream/wiki/Статьи%20на%20русском/Устройство%20скриптовой%20машины/PROCEDURE,%20FUNCTION.%20Параметры%20справа%20и%20слева.Часть%202

      Удалить
    4. https://bitbucket.org/lulinalex/mindstream/src/f9210f3f567967cd9746581f58c507b3cdb12c51/Examples/Scripts/?at=B284_Inheritance_Try

      Удалить
    5. http://programmingmindstream.blogspot.ru/2015/08/blog-post_26.html?m=1

      Удалить
    6. Процесс компиляции скриптов это тоже некая программа на которую можно влиять из самого компилируемого скрипта. Есть слова непосредственного выполнения. Они вызываются в процессе компиляции. Когда встречаются во входном потоке. Они могут управлять процессом компиляции, а также трансформировать входной поток. Фильтровать его. Или добавлять в него что-то своё. Процесс - рекурсивный. На выходе получается структура данных, которая умеет вести себя активно. Т.е. Как выполяемый код.

      Удалить
    7. Эта идея взята из языка Forth.

      Удалить
    8. Собственно в этом ToDo этот процесс вкратце и описан.

      Грамматика try..finally..end сводится к try_finally a b, где a и b - лямбды (замыкания).

      Удалить
    9. То есть пользователь пишет примитив верхнего уровня, а он транслируется в более низкоуровневые.

      Удалить
    10. Ну а try..finally..end в свою очередь можно вывести из скажем русскоязычного:
      попробовать..всегда..

      Удалить
    11. http://programmingmindstream.blogspot.ru/2015/08/blog-post_10.html?m=1

      Удалить
    12. Ну а выражение:

      A := 1 + 2 * 3;

      Преобразуется в итоге в ОПЗ (обратную польскую запись):

      1 2 3 mul add @ A setValue

      Удалить
    13. Ну и есть например фильтры для html И xml

      Удалить
  3. На этих же скриптах построена генерация кода из UML в Delphi. И несколько других языков.

    ОтветитьУдалить
  4. Слова непосредственного выполнения это сродни "продвинутым макросам".

    Как будто если бы в Delphi можно было бы написать:

    uses
    A,
    B,
    C,
    if FileExists 'D' then D
    ;

    Т.е. D - включается по условию.

    ОтветитьУдалить
  5. Ну или:

    MACRO XXX
    LITERAL IN N
    RULES
    (N = 1)
    ( PushToken 'YYY')
    (N = 2)
    ( PushString 'YYY' )
    DEFAULT
    ( PushToken N )
    ; // RULES
    ; // XXX

    XXX 1 Преобразуется в:
    YYY

    а

    XXX 2 в:
    'YYY'

    XXX 3 в:
    3

    Т.е. описываются правила трансформации входного потока.

    ОтветитьУдалить
    Ответы
    1. Пример кодогенерации:
      http://programmingmindstream.blogspot.ru/2016/05/1244.html

      Удалить
    2. Также есть возможность печати стека вызовов и стека значений. И прочие отладочные штучки. Типа дампа скомпилированного кода.

      Удалить
  6. Также это в некотором смысле - аналог json.

    Можно написать:

    Elem A
    Elem B
    ;
    Elem C
    ;
    ;

    FORWARD .Print // - чтобы можно было себя рекурсивно вызывать
    PROCEDURE .Print
    IN anElement
    anElement .Stereotype .Out // - печатаем стереотип элемента
    anElement .Name .Out // - печатаем имя элемента
    anElement .MembersIterator .for .Print
    // - итерируем вложенные элементы и вызываем себя рекурсивно
    ;

    @ A .Print

    Будет напечатано:
    Elem
    A
    Elem
    B
    Elem
    C

    А можно написать так:

    STRING VAR S
    S :=
    '
    Elem A
    Elem B
    ;
    Elem C
    ;
    ;
    '
    >>> S // - кладём "код в строку"
    // Да - строки в кавычках могут содержать в себе и переводы строк тоже

    S
    .CompileStringAndDo .Print
    // - компилируем строку и вызываем для построенного кода функцию .Print

    Результат будет тот же.

    ОтветитьУдалить
  7. http://programmingmindstream.blogspot.ru/2017/06/blog-post_24.html

    ОтветитьУдалить
  8. http://programmingmindstream.blogspot.ru/2017/06/blog-post_11.html

    ОтветитьУдалить
  9. http://programmingmindstream.blogspot.ru/2017/06/blog-post_99.html

    ОтветитьУдалить
  10. http://18delphi.blogspot.ru/2016/03/870-emulation-of-forto.html

    ОтветитьУдалить
  11. Очень много информации. На мой взгляд не хватает краткого обзора, небольшой статьи о функциях и преимуществах языка с примерами. После прочтения документации выстраивается, конечно, картина. Но это не быстро. И вопросы есть.
    Лично для меня тема очень интересна, по моему это самое интересное в блоге вообще.
    Кроме прочего интересно было бы почитать о возникновении и развитии дизайна языка. Со стороны могу сказать что много моментов которые "не сразу очевидны" и "только кодом" не всегда можно обойтись.
    Надо будет и самому "покурить и потыкать", может что-то написать. =)

    ОтветитьУдалить
    Ответы
    1. Да, мне тоже кажется, что это самое интересное в блоге. Спасибо. Только "ценителей" - мало. Мало кому интересны "велосипеды".

      Удалить
    2. Если кажется интересным - пишите на почту. Lulinalex@gmail.com могу выслать свежую версию скриптовой машины.

      Ну и скоро я её в git залью.

      Удалить
    3. Насчёт "грамматики":

      https://m.habrahabr.ru/post/220365/

      Удалить
    4. http://demin.ws/blog/russian/2012/09/27/fcode/

      Удалить
    5. "Дизайн" языка родился спонтанно и развивался эволюционно. Сначала для нужд автоматического тестирования. А потом для нужд кодогенерации и генерации текстов.

      Удалить
    6. Язык - мультипарадигменный. Там есть и процедурность, и ооп, и "ассемблер", и "функциональщина".

      Всё выводится из базовой грамматики и базовых словарей.

      Удалить