четверг, 13 августа 2015 г.

Коротко. А ещё бывает стек скриптовой машины

Консольная запускалка скриптов

А ещё бывает стек скриптовой машины.

Почти человекочитабельный:

i.LULIN-BOOK2     12.08.2015 01:22:45:703   [Stack #  0] :
i.LULIN-BOOK2     12.08.2015 01:22:47:634   [Stack #  0] :
i.LULIN-BOOK2     12.08.2015 01:22:49:209 Script failed: StackChecking1.ms.script
i.LULIN-BOOK2     12.08.2015 01:22:49:209   [Stack #  0] ASSERTS
i.LULIN-BOOK2     12.08.2015 01:22:49:209   [Stack #  1] OPERATOR анти-тест (Line 696, kwMain.script)
i.LULIN-BOOK2     12.08.2015 01:22:49:209   [Stack #  2] анти-тест (Line 5, StackChecking1.ms.script)
i.LULIN-BOOK2     12.08.2015 01:22:49:209   [Stack #  3] (StackChecking1.ms.script)
i.LULIN-BOOK2     12.08.2015 01:22:49:661 Script failed: StackChecking2.ms.script
i.LULIN-BOOK2     12.08.2015 01:22:49:661   [Stack #  0] ASSERTS
i.LULIN-BOOK2     12.08.2015 01:22:49:661   [Stack #  1] OPERATOR анти-тест (Line 696, kwMain.script)
i.LULIN-BOOK2     12.08.2015 01:22:49:661   [Stack #  2] анти-тест (Line 5, StackChecking2.ms.script)
i.LULIN-BOOK2     12.08.2015 01:22:49:661   [Stack #  3] (StackChecking2.ms.script)
i.LULIN-BOOK2     12.08.2015 01:22:49:855 Script failed: StackChecking3.ms.script
i.LULIN-BOOK2     12.08.2015 01:22:49:855   [Stack #  0] ASSERTS
i.LULIN-BOOK2     12.08.2015 01:22:49:855   [Stack #  1] OPERATOR анти-тест (Line 696, kwMain.script)
i.LULIN-BOOK2     12.08.2015 01:22:49:855   [Stack #  2] анти-тест (Line 5, StackChecking3.ms.script)
i.LULIN-BOOK2     12.08.2015 01:22:49:855   [Stack #  3] (StackChecking3.ms.script)
i.LULIN-BOOK2     12.08.2015 01:22:50:051 Script failed: StackChecking4.ms.script
i.LULIN-BOOK2     12.08.2015 01:22:50:051   [Stack #  0] ASSERTS
i.LULIN-BOOK2     12.08.2015 01:22:50:051   [Stack #  1] OPERATOR анти-тест (Line 696, kwMain.script)
i.LULIN-BOOK2     12.08.2015 01:22:50:051   [Stack #  2] анти-тест (Line 5, StackChecking4.ms.script)
i.LULIN-BOOK2     12.08.2015 01:22:50:051   [Stack #  3] (StackChecking4.ms.script)
i.LULIN-BOOK2     12.08.2015 01:22:50:282   [Stack #  0] :
i.LULIN-BOOK2     12.08.2015 01:22:50:282   [Stack #  1] USES
i.LULIN-BOOK2     12.08.2015 01:22:50:517   [Stack #  0] :
i.LULIN-BOOK2     12.08.2015 01:22:50:517   [Stack #  1] USES


(+) https://bitbucket.org/lulinalex/mindstream/commits/1a4d170478480bf9822d80f2170d70a70f1c0ff8

Тут дело в том, что КАЖДЫЙ примитив аксиоматики - ПРОТЕСТИРОВАН атомарными тестами.

В Other1.

"Чистой воды" TDD.

ЛЮБАЯ функция - протестирована.

Причём с реверсом через CodeDump.

Тестируем не только функционал, но и то во что он компилируется.

Под любую функцию написан тест, проверяющий основные потоки. При помощи вывода в эталон.

Pascal натянутый на FORTH.

Но проще и Pascal и FORTH.

Писать очень просто.

При должном навыке.

Проще чем на Delphi.

И уж всяко проще классического FORTH.

DUP DROP ROT - это всё как раз наследие классического FORTH
они на самом деле почти не используются на верхнем уровне.

(+) http://www.twirpx.com/file/1364695/
(+)(+) http://www.nncron.ru/download/sf.pdf

(+) http://fforum.winglion.ru/viewtopic.php?t=1280

"Форт - технология программирования с расширяемостью, причём отсутствуют теоретические ограничения на уровень, с которого возможно расширение - от регистров до самых сложных вещей, моделирования любых грамматик ... 
только фортеры очень редко этим пользуются, если пользуются вообще."

"Этим Форт отличается от других языков - скажем С - макросами расширяем только с того уровня абстракции, на котором находится сам С, С++ - свои ограничения"

"Форт интересен уже только тем, что позволяет модифицировать сами средства своей модификации, чего не может например ассемблер. Форт по сути это исполняемый в цикле макроассемблер у которого есть доступ к модификации своего движка из входного для него потока. Отсюда все возможности: от изменения "понимания" входного потока(введение новых синтаксисов) и изменения техники компиляции(оптимизация) до повышения семантической мощности 
лексических единиц языка до уровня, достаточного для решения задачи практически любой сложности."

"вот с оценкой форта, как макроассемблера я не согласен абсолютно, хотя бы по той причине, что форт навязывает еще и модель взаимодействия внутри себя, а так же существует в рамках некой виртуальной машины, которая достаточно стандартизирована.

Это узкое по моему мнению понимание Форта. Форт может на ходу(в рантайме) сменить и виртуальную машину и модель 
взаимодействия."

"Может, с некоторыми оговорками, к скриптовым языкам. И в этом направлении "копать":) 
( т.к. у него в базовом варианте нет определения типа оперирируемых данных 
при исполнении. Хотя он почти бизтиповый.) Еще можно классифицировать 
как язык позволяющий проводить сцепление простых элементов естественным 
способом. 

P.S. Прочитав статью:Сценарии: высокоуровневое программирование для XXI века http://www.osp.ru/os/1998/03/179470/ где описывается 
история и возможности Tcl привело к мысли, что синтаксис и базис 
языка должен быть, как можно проще. Форт можно дополнить некоторыми 
концепциями из Tcl, не только интерфейсом к GUI. 
Еще немного интересного по Tcl http://tclstudy.narod.ru/articles/index.html 
Книг на русском языке издано мало ( единицы )"




FORWARD Process

: Process
 STRING IN aDir

 FORWARD ProcessItem

 : DoDir
  STRING IN anItem

  : DoFile
   STRING IN anItem
   anItem .
  ; // DoFile

  for [ '*.ms.script' '*.ms.dict' '*.pas' '*.txt' '*.inc' '*.fmx' '*.xml' '*.dpr' ] (
   STRING IN aMask
   @ DoFile aMask anItem ProcessFilesWithMask
  )
 ; // DoDir

 : ProcessItem
  STRING IN anItem
  anItem DoDir
  @ ProcessItem anItem ProcessSubDirs
 ; // ProcessItem

 aDir ProcessItem
; // Process

'..\..\' Process

(+)
: Process
 STRING IN aDir

 FORWARD ProcessItem

 : DoDir
  STRING IN aDir

  : DoFile
   STRING IN anFilePath
   anFilePath Print
  ; // DoFile

  for [ '*.ms.script' '*.ms.dict' '*.pas' '*.txt' '*.inc' '*.fmx' '*.xml' '*.dpr' ] (
   STRING IN aMask
   IterateFilesWithMask aDir aMask DoFile
  )
 ; // DoDir

 : ProcessItem
  STRING IN aDir
  aDir DoDir
  IterateDirs aDir ProcessItem
 ; // ProcessItem

 aDir ProcessItem
; // Process

'..\..\' Process

(+)

PROCEDURE ProcessDirs
 ^ IN aDir

 FORWARD ProcessItem

 PROCEDURE DoDir
  ^ IN aDir

  PROCEDURE DoFile
   STRING IN anFilePath
   PrintThis anFilePath
  ; // DoFile

  for [ '*.ms.script' '*.ms.dict' '*.pas' '*.txt' '*.inc' '*.fmx' '*.xml' '*.dpr' ] (
   STRING IN aMask
   IterateFilesWithMask aDir aMask DoFile
  )
 ; // DoDir

 PROCEDURE ProcessItem
  STRING IN aDir
  DoDir aDir
  IterateDirs aDir ProcessItem
 ; // ProcessItem

 aDir DO ProcessItem
; // ProcessDirs

ProcessDirs '..\..\'

(+)

PROCEDURE ProcessDirs
 RightParam aDir

 FORWARD ProcessItem

 PROCEDURE DoDir
  RightParam aDir

  PROCEDURE DoFile
   STRING IN anFilePath
   PrintThis anFilePath
  ; // DoFile

  for [ '*.ms.script' '*.ms.dict' '*.pas' '*.txt' '*.inc' '*.fmx' '*.xml' '*.dpr' ] (
   STRING IN aMask
   IterateFilesWithMask aDir aMask DoFile
  )
 ; // DoDir

 PROCEDURE ProcessItem
  STRING IN aDir
  DoDir aDir
  IterateDirs aDir ProcessItem
 ; // ProcessItem

 aDir DO ProcessItem
; // ProcessDirs

ProcessDirs '..\..\'

(+)
PROCEDURE ProcessDirs
 ARRAY IN aMaskArray
 RightParam aDir

 PROCEDURE DoDir
  RightParam aDir

  PROCEDURE DoFile
   STRING IN anFilePath
   PrintThis anFilePath
  ; // DoFile

  for aMaskArray (
   STRING IN aMask
   IterateFilesWithMask aDir aMask DoFile
  )
 ; // DoDir

 PROCEDURE ProcessItem
  STRING IN aDir
  DoDir aDir
  IterateDirs aDir ( this.do )
 ; // ProcessItem

 aDir DO ProcessItem
; // ProcessDirs

[ '*.ms.script' '*.ms.dict' '*.pas' '*.txt' '*.inc' '*.fmx' '*.xml' '*.dpr' ] ProcessDirs '..\..\'

(+)

PROCEDURE ProcessDirs
 RightParam aDir
 RightParam aMaskArray
 RightParam aLambda

 PROCEDURE DoDir
  RightParam aDir

  PROCEDURE DoFile
   STRING IN anFilePath
   anFilePath aLambda pop:Word:GetRef DO
  ; // DoFile

  for ( aMaskArray |^ ) (
   STRING IN aMask
   IterateFilesWithMask aDir aMask DoFile
  )
 ; // DoDir

 PROCEDURE ProcessItem
  STRING IN aDir
  DoDir aDir
  IterateDirs aDir ( this.do )
 ; // ProcessItem

 aDir DO ProcessItem
; // ProcessDirs

ProcessDirs '..\..\' [ '*.ms.script' '*.ms.dict' '*.pas' '*.txt' '*.inc' '*.fmx' '*.xml' '*.dpr' ] Print

(+)

PROCEDURE ProcessSubDirsWithMasks
 RightParam aRoot
 RightParam aMaskArray
 RightParam aLambda

 PRIVATE PROCEDURE DoDir
  RightParam aDir

  PRIVATE PROCEDURE DoFile
   STRING IN anFilePath
   anFilePath aLambda |@ DO
  ; // DoFile

  for ( aMaskArray |^ ) (
   STRING IN aMask
   IterateFilesWithMask aDir aMask DoFile
  )
 ; // DoDir

 PRIVATE PROCEDURE ProcessItem
  STRING IN aDir
  DoDir aDir
  IterateDirs aDir ( this.do )
 ; // ProcessItem

 aRoot DO ProcessItem
; // ProcessSubDirsWithMasks

ProcessSubDirsWithMasks '..\..\' [ '*.ms.script' '*.ms.dict' '*.pas' '*.txt' '*.inc' '*.fmx' '*.xml' '*.dpr' ] Print

(+)

ProcessSubDirsWithMasks '..\..\' [ '*.ms.script' '*.ms.dict' '*.pas' '*.txt' '*.inc' '*.fmx' '*.xml' '*.dpr' ] Print

(+)

PROCEDURE ProcessAnySubDirsWithMasks

 RightParam aDirMasks
 RightParam aFileMasks

 for ( aDirMasks |^ ) ( STRING IN aDirMask ProcessSubDirsWithMasks aDirMask ( aFileMasks |^ ) Print )

; // ProcessAnySubDirsWithMasks

ProcessAnySubDirsWithMasks [ '..\..\' '..\' ] [ '*.ms.script' '*.ms.dict' '*.pas' '*.txt' '*.inc' '*.fmx' '*.xml' '*.dpr' '*.co' ]

(+)

ProcessAnySubDirsWithMasks [ '..\..\' '..\' ] [ '*.ms.script' '*.ms.dict' '*.pas' '*.txt' '*.inc' '*.fmx' '*.xml' '*.dpr' '*.co' ] Print

Комментариев нет:

Отправить комментарий