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.
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.
Планируется развитие языка во что-то подобное lua? Или это локальная разработка?
ОтветитьУдалитьПланируется. Есть консольная запускалка. Есть возможность подключать к проектам на Delphi.
УдалитьИ по сути это не совсем скрипты. А машинка для описания собственных грамматик.
Как для кода, так и для данных.
Для описания грамматик? Это как? Вообще интересно.
УдалитьНу минимальная автоматика с возможностью оперировать потоком токенов. И возможностью на основе аксиоматики строить другие конструкции и менять правила разбора.
УдалитьВнутри стэковая машина.
Ну и помимо собственно аксиоматики есть возможность экспортировать в машинку словари-обёртки над кодом из дельфи. Сейчас туда вытащен почти весь rtl/vcl.
УдалитьНу и масса своих объектов и интерфейсов.
Но это уже не аксиоматика, а "батарейки".
Ну и помимо собственно аксиоматики есть возможность экспортировать в машинку словари-обёртки над кодом из дельфи. Сейчас туда вытащен почти весь rtl/vcl.
УдалитьНу и масса своих объектов и интерфейсов.
Но это уже не аксиоматика, а "батарейки".
Я писал уже несколько статей про устройство.
УдалитьМогу попробовать написать ещё.
И есть репозитарий gut с примерами.
ОтветитьУдалитьБуду за компьютером - накидаю ссылок.
УдалитьВ отличии от питона это компилятор, а не интерпретатор.
УдалитьТакже есть rtti и рефлексия.
А также функциональные штучки типа map/reduce. И кеширования результатов вычисления.
https://bitbucket.org/lulinalex/mindstream/wiki/Статьи%20на%20русском/Устройство%20скриптовой%20машины/PROCEDURE,%20FUNCTION.%20Параметры%20справа%20и%20слева.Часть%202
Удалитьhttps://bitbucket.org/lulinalex/mindstream/src/f9210f3f567967cd9746581f58c507b3cdb12c51/Examples/Scripts/?at=B284_Inheritance_Try
Удалитьhttp://programmingmindstream.blogspot.ru/2015/08/blog-post_26.html?m=1
УдалитьПроцесс компиляции скриптов это тоже некая программа на которую можно влиять из самого компилируемого скрипта. Есть слова непосредственного выполнения. Они вызываются в процессе компиляции. Когда встречаются во входном потоке. Они могут управлять процессом компиляции, а также трансформировать входной поток. Фильтровать его. Или добавлять в него что-то своё. Процесс - рекурсивный. На выходе получается структура данных, которая умеет вести себя активно. Т.е. Как выполяемый код.
УдалитьЭта идея взята из языка Forth.
УдалитьСобственно в этом ToDo этот процесс вкратце и описан.
УдалитьГрамматика try..finally..end сводится к try_finally a b, где a и b - лямбды (замыкания).
То есть пользователь пишет примитив верхнего уровня, а он транслируется в более низкоуровневые.
УдалитьНу а try..finally..end в свою очередь можно вывести из скажем русскоязычного:
Удалитьпопробовать..всегда..
http://programmingmindstream.blogspot.ru/2015/08/blog-post_10.html?m=1
УдалитьНу а выражение:
УдалитьA := 1 + 2 * 3;
Преобразуется в итоге в ОПЗ (обратную польскую запись):
1 2 3 mul add @ A setValue
Ну и есть например фильтры для html И xml
УдалитьНа этих же скриптах построена генерация кода из UML в Delphi. И несколько других языков.
ОтветитьУдалитьСлова непосредственного выполнения это сродни "продвинутым макросам".
ОтветитьУдалитьКак будто если бы в Delphi можно было бы написать:
uses
A,
B,
C,
if FileExists 'D' then D
;
Т.е. D - включается по условию.
Ну или:
ОтветитьУдалить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
Т.е. описываются правила трансформации входного потока.
Пример кодогенерации:
Удалитьhttp://programmingmindstream.blogspot.ru/2016/05/1244.html
Также есть возможность печати стека вызовов и стека значений. И прочие отладочные штучки. Типа дампа скомпилированного кода.
УдалитьТакже это в некотором смысле - аналог 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
Результат будет тот же.
http://programmingmindstream.blogspot.ru/2017/06/blog-post_24.html
ОтветитьУдалитьhttp://programmingmindstream.blogspot.ru/2017/06/blog-post_11.html
ОтветитьУдалитьhttp://programmingmindstream.blogspot.ru/2017/06/blog-post_99.html
ОтветитьУдалитьhttp://18delphi.blogspot.ru/2016/03/870-emulation-of-forto.html
ОтветитьУдалитьОчень много информации. На мой взгляд не хватает краткого обзора, небольшой статьи о функциях и преимуществах языка с примерами. После прочтения документации выстраивается, конечно, картина. Но это не быстро. И вопросы есть.
ОтветитьУдалитьЛично для меня тема очень интересна, по моему это самое интересное в блоге вообще.
Кроме прочего интересно было бы почитать о возникновении и развитии дизайна языка. Со стороны могу сказать что много моментов которые "не сразу очевидны" и "только кодом" не всегда можно обойтись.
Надо будет и самому "покурить и потыкать", может что-то написать. =)
Да, мне тоже кажется, что это самое интересное в блоге. Спасибо. Только "ценителей" - мало. Мало кому интересны "велосипеды".
УдалитьЕсли кажется интересным - пишите на почту. Lulinalex@gmail.com могу выслать свежую версию скриптовой машины.
УдалитьНу и скоро я её в git залью.
Насчёт "грамматики":
Удалитьhttps://m.habrahabr.ru/post/220365/
https://m.habrahabr.ru/post/29967/
Удалитьhttp://demin.ws/blog/russian/2012/09/27/fcode/
Удалить"Дизайн" языка родился спонтанно и развивался эволюционно. Сначала для нужд автоматического тестирования. А потом для нужд кодогенерации и генерации текстов.
УдалитьЯзык - мультипарадигменный. Там есть и процедурность, и ооп, и "ассемблер", и "функциональщина".
УдалитьВсё выводится из базовой грамматики и базовых словарей.