Rough draft of modules
This includes a naive implementation of a module system where imported files have their imports recursively handled, strips the module/import AST nodes, and then evals everything into a flat environment using namespace prefixes like "Module.function".
This commit is contained in:
		@ -1,4 +1,8 @@
 | 
			
		||||
main = toSource not?
 | 
			
		||||
!module ToSource
 | 
			
		||||
 | 
			
		||||
!import "lib/base.tri" Lib
 | 
			
		||||
 | 
			
		||||
main = toSource Lib.not?
 | 
			
		||||
-- Thanks to intensionality, we can inspect the structure of a given value
 | 
			
		||||
-- even if it's a function. This includes lambdas which are eliminated to
 | 
			
		||||
-- Tree Calculus (TC) terms during evaluation.
 | 
			
		||||
@ -12,29 +16,29 @@ main = toSource not?
 | 
			
		||||
-- triage = (\leaf stem fork : t (t leaf stem) fork)
 | 
			
		||||
 | 
			
		||||
-- Base case of a single Leaf
 | 
			
		||||
sourceLeaf = t (head "t")
 | 
			
		||||
sourceLeaf = t (Lib.head "t")
 | 
			
		||||
 | 
			
		||||
-- Stem case
 | 
			
		||||
sourceStem = (\convert : (\a rest :
 | 
			
		||||
  t (head "(")                       -- Start with a left parenthesis "(".
 | 
			
		||||
    (t (head "t")                    -- Add a "t"
 | 
			
		||||
      (t (head " ")                  -- Add a space.
 | 
			
		||||
        (convert a                   -- Recursively convert the argument.
 | 
			
		||||
          (t (head ")") rest))))))   -- Close with ")" and append the rest.
 | 
			
		||||
  t (Lib.head "(")                       -- Start with a left parenthesis "(".
 | 
			
		||||
    (t (Lib.head "t")                    -- Add a "t"
 | 
			
		||||
      (t (Lib.head " ")                  -- Add a space.
 | 
			
		||||
        (convert a                       -- Recursively convert the argument.
 | 
			
		||||
          (t (Lib.head ")") rest))))))   -- Close with ")" and append the rest.
 | 
			
		||||
 | 
			
		||||
-- Fork case
 | 
			
		||||
sourceFork = (\convert : (\a b rest :
 | 
			
		||||
  t (head "(")                           -- Start with a left parenthesis "(".
 | 
			
		||||
    (t (head "t")                        -- Add a "t"
 | 
			
		||||
      (t (head " ")                      -- Add a space.
 | 
			
		||||
        (convert a                       -- Recursively convert the first arg.
 | 
			
		||||
          (t (head " ")                  -- Add another space.
 | 
			
		||||
            (convert b                   -- Recursively convert the second arg.
 | 
			
		||||
              (t (head ")") rest)))))))) -- Close with ")" and append the rest.
 | 
			
		||||
  t (Lib.head "(")                           -- Start with a left parenthesis "(".
 | 
			
		||||
    (t (Lib.head "t")                        -- Add a "t"
 | 
			
		||||
      (t (Lib.head " ")                      -- Add a space.
 | 
			
		||||
        (convert a                           -- Recursively convert the first arg.
 | 
			
		||||
          (t (Lib.head " ")                  -- Add another space.
 | 
			
		||||
            (convert b                       -- Recursively convert the second arg.
 | 
			
		||||
              (t (Lib.head ")") rest)))))))) -- Close with ")" and append the rest.
 | 
			
		||||
 | 
			
		||||
-- Wrapper around triage 
 | 
			
		||||
toSource_ = y (\self arg :
 | 
			
		||||
  triage
 | 
			
		||||
toSource_ = Lib.y (\self arg :
 | 
			
		||||
  Lib.triage
 | 
			
		||||
    sourceLeaf        -- `triage` "a" case, Leaf
 | 
			
		||||
    (sourceStem self) -- `triage` "b" case, Stem
 | 
			
		||||
    (sourceFork self) -- `triage` "c" case, Fork
 | 
			
		||||
@ -43,5 +47,5 @@ toSource_ = y (\self arg :
 | 
			
		||||
-- toSource takes a single TC term and returns a String
 | 
			
		||||
toSource = \v : toSource_ v ""
 | 
			
		||||
 | 
			
		||||
exampleOne = toSource true -- OUT: "(t t)"
 | 
			
		||||
exampleTwo = toSource not? -- OUT: "(t (t (t t) (t t t)) (t t (t t t)))"
 | 
			
		||||
exampleOne = toSource Lib.true -- OUT: "(t t)"
 | 
			
		||||
exampleTwo = toSource Lib.not? -- OUT: "(t (t (t t) (t t t)) (t t (t t t)))"
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user