diff options
-rw-r--r-- | .gitignore | 11 | ||||
-rw-r--r-- | LICENSE | 21 | ||||
-rw-r--r-- | Makefile | 17 | ||||
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | Smurf.dcl | 28 | ||||
-rw-r--r-- | Smurf.icl | 118 | ||||
-rw-r--r-- | SmurfParse.dcl | 8 | ||||
-rw-r--r-- | SmurfParse.icl | 49 | ||||
-rw-r--r-- | test.icl | 34 | ||||
-rw-r--r-- | test.prj | 508 |
10 files changed, 800 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1fc2545 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +# Executables +*.exe +*.out +test + +# Directory used to store object files, abc files and assembly files +Clean System Files/ + +# iTasks environment extra data +*-data/ +sapl/ @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Camil Staps + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f017434 --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +CPM=cpm +TEST=test +DEPS=Smurf.dcl Smurf.icl SmurfParse.dcl SmurfParse.icl + +all: $(TEST) + +$(TEST): %: %.icl $(DEPS) + $(CPM) project $@.prj build + +run_test: $(TEST) + ./$^ + +clean: + rm -fvr $(TEST) Clean\ System\ Files + +.PHONY: all clean run_test + diff --git a/README.md b/README.md new file mode 100644 index 0000000..4c08583 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# CleanSmurf +Smurf interpreter in Clean + +## Copyright & license +Copyright © 2016 Camil Staps. Licensed under MIT, see LICENSE. + diff --git a/Smurf.dcl b/Smurf.dcl new file mode 100644 index 0000000..c4f1c45 --- /dev/null +++ b/Smurf.dcl @@ -0,0 +1,28 @@ +definition module Smurf + +from StdOverloaded import class zero, class toString + +from Data.Maybe import ::Maybe + +:: Stm = Push String + | Input | Output + | Cat | Head | Tail | Quotify + | Put | Get | Exec + +:: Program :== [Stm] + +:: Stack :== [String] +:: Store :== [(String, String)] + +:: State = { stack :: Stack + , store :: Store + } + +instance toString Stm + +instance zero State +instance toString State + +step :: !Program State !*File -> *(Maybe (!Program, State), *File) +run :: !Program State *File -> *(Maybe State, *File) + diff --git a/Smurf.icl b/Smurf.icl new file mode 100644 index 0000000..f00ef65 --- /dev/null +++ b/Smurf.icl @@ -0,0 +1,118 @@ +implementation module Smurf + +from StdFunc import o, flip +import StdArray +import StdList +import StdString +import StdTuple +import StdFile + +from Data.Func import $ +import Control.Applicative +import Control.Monad +import Data.Maybe + +import SmurfParse + +instance zero [a] where zero = [] + +instance toString Stm +where + toString (Push s) = "\"" +++ s +++ "\"" + toString Input = "i" + toString Output = "o" + toString Cat = "+" + toString Head = "h" + toString Tail = "t" + toString Quotify = "q" + toString Put = "p" + toString Get = "g" + toString Exec = "x" + +instance zero State where zero = { stack = zero, store = zero } + +instance toString State +where + toString {stack, store} + = "Stack:\n" + +++ foldl (+++) "" [" " +++ val +++ "\n" \\ val <- stack] + +++ "Store:\n" + +++ foldl (+++) "" [" " +++ var +++ " : " +++ val +++ "\n" + \\ (var, val) <- store] + +run :: !Program State *File -> *(Maybe State, *File) +run prog st io + # (mbProgSt, io) = step prog st io + | isNothing mbProgSt = (Nothing, io) + # (prog, st) = fromJust mbProgSt + = if (isEmpty prog) (Just st, io) (run prog st io) + +step :: !Program State !*File -> *(Maybe (!Program, State), *File) +step [] st io + = (pure ([], st), io) +step [Push s:p] st io + = (pure (p, { st & stack = push s st.stack }), io) +step [Input:p] st io + # (ip, io) = freadline io + # ip = ip % (0, size ip - 2) + = (pure (p, { st & stack = push ip st.stack }), io) +step [Output:p] st io + # mbSStk = pop st.stack + | isNothing mbSStk = (empty, io) + # (s, stk) = fromJust mbSStk + = (pure (p, { st & stack = stk }), io <<< s) +step [Cat:p] st io + = (pop st.stack >>= \(x,stk) -> pop stk >>= \(y,stk`) -> + pure (p, { st & stack = push (y +++ x) stk` }), io) +step [Head:p] st io + = (pop st.stack >>= \(x,stk) -> head x >>= \x` -> + pure (p, { st & stack = push x` stk }), io) +step [Tail:p] st io + = (pop st.stack >>= \(x,stk) -> tail x >>= \x` -> + pure (p, { st & stack = push x` stk }), io) +step [Quotify:p] st io + = (pop st.stack >>= \(x,stk) -> + pure (p, { st & stack = push (quotify x) stk }), io) +step [Put:p] st io + = (pop st.stack >>= \(var,stk) -> pop stk >>= \(val,stk`) -> + pure (p, { st & stack = stk`, store = put var val st.store }), io) +step [Get:p] st io + = (pop st.stack >>= \(var,stk) -> + pure (p, { st & stack = push (get var st.store) stk }), io) +step [Exec:p] st io + = (pop st.stack >>= parse o fromString o fst >>= \p -> + pure (p, zero), io) + +push :: String Stack -> Stack +push s st = [s:st] + +pop :: Stack -> Maybe (String, Stack) +pop [] = empty +pop [s:ss] = pure (s, ss) + +head :: String -> Maybe String +head "" = empty +head s = pure $ s % (0,0) + +tail :: String -> Maybe String +tail "" = empty +tail s = pure $ s % (1, size s - 1) + +put :: String String Store -> Store +put var val store = [(var,val) : filter ((<>)var o fst) store] + +get :: String Store -> String +get var store = case filter ((==)var o fst) store of [] = ""; [(_,val):_] = val + +quotify :: (String -> String) +quotify = (flip (+++) "\"") o ((+++)"\"") o toString o quot o fromString +where + quot :: [Char] -> [Char] + quot [] = [] + quot ['\\':cs] = ['\\':'\\':quot cs] + quot ['\n':cs] = ['\\':'n':quot cs] + quot ['\r':cs] = ['\\':'r':quot cs] + quot ['\t':cs] = ['\\':'t':quot cs] + quot ['"':cs] = ['\\':'"':quot cs] + quot [c:cs] = [c:quot cs] + diff --git a/SmurfParse.dcl b/SmurfParse.dcl new file mode 100644 index 0000000..fb06ab3 --- /dev/null +++ b/SmurfParse.dcl @@ -0,0 +1,8 @@ +definition module SmurfParse + +from Data.Maybe import ::Maybe + +from Smurf import ::Program, ::Stm + +parse :: ![Char] -> Maybe Program + diff --git a/SmurfParse.icl b/SmurfParse.icl new file mode 100644 index 0000000..71bfc34 --- /dev/null +++ b/SmurfParse.icl @@ -0,0 +1,49 @@ +implementation module SmurfParse + +from StdFunc import o, flip +import StdChar +import StdList +import StdFile +import StdTuple +import StdString + +from Data.Func import $ +import Data.Maybe +import Control.Applicative +import Control.Monad + +import Smurf + +parse :: ![Char] -> Maybe Program +parse [] = pure [] +parse ['"':cs] = parseString cs >>= \(s,cs`) -> append (Push s) $ parse cs` +parse ['i':cs] = apparse Input cs +parse ['o':cs] = apparse Output cs +parse ['+':cs] = apparse Cat cs +parse ['h':cs] = apparse Head cs +parse ['t':cs] = apparse Tail cs +parse ['q':cs] = apparse Quotify cs +parse ['p':cs] = apparse Put cs +parse ['g':cs] = apparse Get cs +parse ['x':cs] = apparse Exec cs +parse [c:cs] = if (isSpace c) (parse cs) empty + +apparse :: Stm -> [Char] -> Maybe Program +apparse stm = append stm o parse + +append :: a (m [a]) -> m [a] | Monad m +append x mx = mx >>= \xs -> pure [x:xs] + +parseString :: ![Char] -> Maybe (String, [Char]) +parseString cs = pS [] cs +where + pS :: ![Char] ![Char] -> Maybe (String, [Char]) + pS _ [] = empty + pS s ['"':cs] = pure (toString $ reverse s, cs) + pS s ['\\':'n':cs] = pS ['\n':s] cs + pS s ['\\':'r':cs] = pS ['\r':s] cs + pS s ['\\':'t':cs] = pS ['\t':s] cs + pS s ['\\':'\\':cs] = pS ['\\':s] cs + pS s ['\\':'"':cs] = pS ['"':s] cs + pS s [c:cs] = pS [c:s] cs + diff --git a/test.icl b/test.icl new file mode 100644 index 0000000..77e836c --- /dev/null +++ b/test.icl @@ -0,0 +1,34 @@ +module test + +import StdEnv +import Data.Maybe +from Data.Func import $ + +import Smurf +import SmurfParse + +Start :: *World -> *World +Start w +# (io, w) = stdio w +//# io = loop (prog reverse) zero io +# (mbSt, io) = run (prog reverse) zero io +# result = if (isNothing mbSt) "uh-oh." (toString $ fromJust mbSt) +# io = io <<< "\n--------------------\n" <<< result <<< "\n" += snd $ fclose io w +where + loop :: !Program State !*File -> *File + loop p st f + # (mbProgSt, f) = step p st f + | isNothing mbProgSt = f <<< "NOTHING!!!\n" + # (prog, st) = fromJust mbProgSt + | isEmpty prog = f <<< "\n---------------------------\n" <<< toString st + # f = f <<< "---> " <<< toString (hd prog) <<< " ? " + # (cmd, f) = freadline f + | cmd == "state\n" = loop prog st (f <<< toString st) + = loop prog st f + + prog txt = fromJust $ parse txt + + // From http://esolangs.org/wiki/Smurf + reverse = ['"+"i+""p""gtg""gt"i"p"\\"\\"p\\"i\\"gh\\"o\\"g+\\"o\\"p\\"i\\"gt\\"i\\"p\\"\\\\\\"+\\\\\\"\\\\\\"\\\\\\"p\\"\\"i\\"gq+\\"tg\\"+\\"i\\"gq+\\"\\\\\\"i\\\\\\"p\\"+\\"o\\"gq+\\"\\\\\\"o\\\\\\"p\\"+\\"\\"gq+\\"\\"g+\\"\\"p\\"o\\"gq\\"o\\"+\\"+\\"pgx"""p"\\"+\\"\\"\\"p""i"gq+"tg"+"i"gq+"\\"i\\"p\\"\\""+""gq+""g+""p"""+""i"g+pgx'] + diff --git a/test.prj b/test.prj new file mode 100644 index 0000000..00ff6fb --- /dev/null +++ b/test.prj @@ -0,0 +1,508 @@ +Version: 1.4 +Global + ProjectRoot: . + Target: StdEnv + Exec: {Project}/test + CodeGen + CheckStacks: False + CheckIndexes: True + Application + HeapSize: 2097152 + StackSize: 512000 + ExtraMemory: 8192 + IntialHeapSize: 204800 + HeapSizeMultiplier: 4096 + ShowExecutionTime: False + ShowGC: False + ShowStackSize: False + MarkingCollector: False + DisableRTSFlags: False + StandardRuntimeEnv: True + Profile + Memory: False + MemoryMinimumHeapSize: 0 + Time: False + Stack: False + Output + Output: NoConsole + Font: Monaco + FontSize: 9 + WriteStdErr: False + Link + LinkMethod: Static + GenerateRelocations: False + GenerateSymbolTable: False + GenerateLinkMap: False + LinkResources: False + ResourceSource: + GenerateDLL: False + ExportedNames: + Paths + Path: {Project}/ + Path: {Application}/lib/Generics/ + Path: {Application}/lib/clean-platform/OS-Independent/ + Precompile: + Postlink: +MainModule + Name: test + Dir: {Project} + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False +OtherModules + Module + Name: Smurf + Dir: {Project}/ + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: SmurfParse + Dir: {Project}/ + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: GenEq + Dir: {Application}/lib/Generics/ + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: Control.Applicative + Dir: {Application}/lib/clean-platform/OS-Independent/ + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: Control.Monad + Dir: {Application}/lib/clean-platform/OS-Independent/ + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: Data.Func + Dir: {Application}/lib/clean-platform/OS-Independent/ + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: Data.Functor + Dir: {Application}/lib/clean-platform/OS-Independent/ + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: Data.List + Dir: {Application}/lib/clean-platform/OS-Independent/ + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: Data.Maybe + Dir: {Application}/lib/clean-platform/OS-Independent/ + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: Data.Monoid + Dir: {Application}/lib/clean-platform/OS-Independent/ + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: Data.Void + Dir: {Application}/lib/clean-platform/OS-Independent/ + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: System.IO + Dir: {Application}/lib/clean-platform/OS-Independent/ + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdArray + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdBool + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdChar + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdCharList + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdClass + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdEnum + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdEnv + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdFile + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdFunc + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdGeneric + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdInt + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdList + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdMisc + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdOrdList + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdOverloaded + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdReal + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdString + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: StdTuple + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: _SystemArray + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False + Module + Name: _SystemEnum + Dir: {Application}/lib/StdEnv + Compiler + NeverMemoryProfile: False + NeverTimeProfile: False + StrictnessAnalysis: True + ListTypes: StrictExportTypes + ListAttributes: True + Warnings: True + Verbose: True + ReadableABC: False + ReuseUniqueNodes: True + Fusion: False |