diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2020-08-14 09:38:30 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2025-03-02 14:24:49 +0000 |
| commit | 90fafe906e99311bacca56ebb444bf99ea3f7804 (patch) | |
| tree | 9722a1e2cd626697caee799c873086f37ccd7bd4 | |
| parent | document and spec Type member fields (diff) | |
| download | alive-90fafe906e99311bacca56ebb444bf99ea3f7804.tar.gz alive-90fafe906e99311bacca56ebb444bf99ea3f7804.zip | |
separate Module and IO code
| -rw-r--r-- | alv/copilot/base.moon | 10 | ||||
| -rw-r--r-- | alv/copilot/fltk.moon | 4 | ||||
| -rw-r--r-- | alv/module.moon | 101 | ||||
| -rw-r--r-- | spec/test_setup.moon | 10 |
4 files changed, 82 insertions, 43 deletions
diff --git a/alv/copilot/base.moon b/alv/copilot/base.moon index fcd1ff4..40600cb 100644 --- a/alv/copilot/base.moon +++ b/alv/copilot/base.moon @@ -4,7 +4,7 @@ -- @classmod Copilot lfs = require 'lfs' import Scope from require 'alv.scope' -import Module from require 'alv.module' +import FSModule from require 'alv.module' import Error from require 'alv.error' import RTNode from require 'alv.rtnode' import Constant from require 'alv.result' @@ -33,8 +33,8 @@ class Copilot --- create a new Copilot. -- @classmethod - -- @tparam string file name/path of the alive file to watch and execute - new: (@args) => + -- @tparam table args + new: (@args={}) => @T = 0 @last_modification = 0 @last_modules = {} @@ -62,7 +62,7 @@ class Copilot @active_modules = nil @last_modules.__root = nil - @last_modules.__root = Module file + @last_modules.__root = FSModule file @active_module = @last_modules.__root COPILOT = nil @@ -84,7 +84,7 @@ class Copilot else last = @active_module prefix = if b = last.file\match'(.*)/[^/]*$' then b .. '/' else '' - mod = @last_modules[name] or Module "#{prefix}#{name}.alv" + mod = @last_modules[name] or FSModule "#{prefix}#{name}.alv" L\trace "entering module #{mod}" @modules[name] = mod @active_module = mod diff --git a/alv/copilot/fltk.moon b/alv/copilot/fltk.moon index 7664f0c..a4e3d08 100644 --- a/alv/copilot/fltk.moon +++ b/alv/copilot/fltk.moon @@ -86,9 +86,9 @@ visit #{version.web} for more information." @status.value = if not @active_module "no script" elseif @paused - "paused | #{@active_module\basename!}" + "paused | #{@active_module\name!}" else - "running | #{@active_module\basename!}" + "running | #{@active_module\name!}" @window\redraw! eval: (dirty) => diff --git a/alv/module.moon b/alv/module.moon index d530712..b10b0f9 100644 --- a/alv/module.moon +++ b/alv/module.moon @@ -1,41 +1,36 @@ ---- -- Per-file execution context. -- --- @classmod Module +-- @module module import Registry from require 'alv.registry' import Error from require 'alv.error' import Scope from require 'alv.scope' import program from require 'alv.parsing' builtins = require 'alv.builtins' -slurp = (file) -> - file = assert (io.open file, 'r'), Error 'io', "couldn't open '#{file}'" - with file\read '*all' - file\close! - -spit = (file, str) -> - file = io.open file, 'w' - file\write str - file\close! - +--- Base class for Modules. +-- @type Module class Module ---- static functions --- @section static - --- create a new Module. -- @classmethod - new: (@file) => + new: => @registry = Registry! ---- members --- @section members + --- check when the module source has last changed. + -- @function poll + -- @treturn number timestamp of last change - --- check whether file was changed. - -- @treturn bool whether the file was changed since the last call - poll: => - { :mode, :modification } = (lfs.attributes @file) or {} - assert mode == 'file', Error 'io', "not a file: '#{@file}'" - modification + --- get the module basename. + -- @function name + -- @treturn string + + --- get the module contents. + -- @function slurp + -- @treturn string + + --- update the module contents. + -- @function spit + -- @tparam string str the updated contents --- start an evaluation cycle. -- @@ -43,7 +38,7 @@ class Module -- Otherwise, register the module with the `Copilot`. Updates `root`. eval: => @registry\begin_eval! - @ast = Error.wrap "parsing '#{@file}'", -> program\match slurp @file + @ast = Error.wrap "parsing '#{@file}'", -> program\match @slurp! assert @ast, Error 'syntax', "failed to parse" scope = Scope builtins @@ -56,17 +51,14 @@ class Module finish: => tags_changed = @registry\end_eval! if tags_changed - spit @file, @ast\stringify! + @spit @ast\stringify! --- destroy this module. destroy: => @registry\destroy! - --- get the module basename. - -- @treturn string - basename: => @file\match '([^/\\]+)$' - - __tostring: => "<Module #{@basename!}>" + __tostring: => "<#{@@__name} #{@name!}>" + __inherited: (cls) => cls.__base.__tostring = @__tostring --- the last updated AST tree for this module. -- @tfield ?AST ast @@ -74,6 +66,55 @@ class Module --- the runtime graph root of this module. -- @tfield ?RTNode root +--- Module type for modules loaded from the filesystem. +-- @type FSModule +class FSModule extends Module + --- create a new FSModule. + -- @classmethod + -- @tparam string file filepath + new: (@file) => + super! + + slurp: => + file = assert (io.open @file, 'r'), Error 'io', "couldn't open '#{@file}'" + with file\read '*all' + file\close! + + spit: (str) => + file = io.open @file, 'w' + file\write str + file\close! + + poll: => + { :mode, :modification } = (lfs.attributes @file) or {} + assert mode == 'file', Error 'io', "not a file: '#{@file}'" + modification + + name: => @file\match '([^/\\]+)$' + +--- Module type for modules loaded from RAM. +-- @type StringModule +class StringModule extends Module + --- create a new StringModule. + -- @classmethod + -- @tparam string name_ module name + -- @tparam string source module source code + new: (@name_, @source) => + super! + @updated = os.time! + + slurp: => @source + + spit: (str) => + @source = str + @updated = os.time! + + poll: => @updated + + name: => @name_ + { :Module + :FSModule + :StringModule } diff --git a/spec/test_setup.moon b/spec/test_setup.moon index a402af4..92bb61e 100644 --- a/spec/test_setup.moon +++ b/spec/test_setup.moon @@ -4,10 +4,8 @@ import Module from require 'alv.module' import Logger from require 'alv.logger' Logger\init 'silent' -class TestModule extends Module - -class TestCopilot extends Copilot - new: => +class TestPilot extends Copilot + new: (code) => @T = 0 @active_module = Module! @@ -21,10 +19,10 @@ class TestCopilot extends Copilot export COPILOT { - :TestCopilot + :TestPilot do_setup: -> - COPILOT = TestCopilot! + COPILOT = TestPilot! COPILOT\begin_eval! do_teardown: -> |
