test¶
include scripts¶
include notebook core¶
In [ ]:
. ../../../../scripts/nbs_header.ps1
Include core functions script¶
In [ ]:
. ../../../../scripts/core.ps1
Include spiral library¶
In [ ]:
. ../../../../lib/spiral/lib.ps1
execute project commands¶
run notebook with retries using spiral supervisor¶
In [ ]:
{ . ../../../../apps/spiral/dist/Supervisor$(_exe) --execute-command "../../../../workspace/target/release/spiral_builder$(_exe) dib --path test.dib --retries 3" } | Invoke-Block
00:00:00 v #1 networking.test_port_open / { port = 13806; ex = System.AggregateException: One or more errors occurred. (Connection refused) } 00:00:00 d #1 runtime.execute_with_options_async / { file_name = ../../../../workspace/target/release/spiral_builder; arguments = US1_0 "dib --path test.dib --retries 3"; options = { command = ../../../../workspace/target/release/spiral_builder dib --path test.dib --retries 3; cancellation_token = Some System.Threading.CancellationToken; environment_variables = [||]; on_line = None; stdin = None; trace = true; working_directory = None } } 00:00:00 v #2 > 00:00:00 d #1 spiral_builder.main / { args = Array(MutCell(["dib", "--path", "test.dib", "--retries", "3"])) } 00:00:00 v #3 > 00:00:00 d #2 runtime.execute_with_options / { file_name = dotnet; arguments = ["repl", "--exit-after-run", "--run", "/home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.dib", "--output-path", "/home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.dib.ipynb"]; options = { command = dotnet repl --exit-after-run --run "/home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.dib" --output-path "/home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.dib.ipynb"; cancellation_token = None; environment_variables = Array(MutCell([("TRACE_LEVEL", "Verbose"), ("AUTOMATION", "True")])); on_line = None; stdin = None; trace = false; working_directory = None } } 00:00:02 v #4 > > 00:00:02 v #5 > > ── markdown ──────────────────────────────────────────────────────────────────── 00:00:02 v #6 > > ╭──────────────────────────────────────────────────────────────────────────────╮ 00:00:02 v #7 > > │ # test (Polyglot) │ 00:00:02 v #8 > > ╰──────────────────────────────────────────────────────────────────────────────╯ 00:00:04 v #9 > > 00:00:04 v #10 > > ── spiral ────────────────────────────────────────────────────────────────────── 00:00:04 v #11 > > //// test 00:00:04 v #12 > > 00:00:04 v #13 > > open testing 00:00:08 v #14 > > 00:00:08 v #15 > > ── spiral ────────────────────────────────────────────────────────────────────── 00:00:08 v #16 > > nominal i = () 00:00:08 v #17 > > nominal e = () 00:00:08 v #18 > > nominal s = () 00:00:08 v #19 > > nominal n = () 00:00:08 v #20 > > nominal t = () 00:00:08 v #21 > > nominal f = () 00:00:08 v #22 > > nominal j = () 00:00:08 v #23 > > nominal p = () 00:00:08 v #24 > > 00:00:08 v #25 > > union sensing = 00:00:08 v #26 > > | Si : s * i 00:00:08 v #27 > > | Se : s * e 00:00:08 v #28 > > 00:00:08 v #29 > > union intuition = 00:00:08 v #30 > > | Ni : n * i 00:00:08 v #31 > > | Ne : n * e 00:00:08 v #32 > > 00:00:08 v #33 > > union thinking = 00:00:08 v #34 > > | Ti : t * i 00:00:08 v #35 > > | Te : t * e 00:00:08 v #36 > > 00:00:08 v #37 > > union feeling = 00:00:08 v #38 > > | Fi : f * i 00:00:08 v #39 > > | Fe : f * e 00:00:08 v #40 > > 00:00:08 v #41 > > union function_stack = 00:00:08 v #42 > > | FS : sensing * intuition * thinking * feeling 00:00:08 v #43 > > 00:00:08 v #44 > > union personality_type = 00:00:08 v #45 > > | ISTJ : i * s * t * j * function_stack 00:00:08 v #46 > > | ISFJ : i * s * f * j * function_stack 00:00:08 v #47 > > | INFJ : i * n * f * j * function_stack 00:00:08 v #48 > > | INTJ : i * n * t * j * function_stack 00:00:08 v #49 > > | ISTP : i * s * t * p * function_stack 00:00:08 v #50 > > | ISFP : i * s * f * p * function_stack 00:00:08 v #51 > > | INFP : i * n * f * p * function_stack 00:00:08 v #52 > > | INTP : i * n * t * p * function_stack 00:00:08 v #53 > > | ESTP : e * s * t * p * function_stack 00:00:08 v #54 > > | ESFP : e * s * f * p * function_stack 00:00:08 v #55 > > | ENFP : e * n * f * p * function_stack 00:00:08 v #56 > > | ENTP : e * n * t * p * function_stack 00:00:08 v #57 > > | ESTJ : e * s * t * j * function_stack 00:00:08 v #58 > > | ESFJ : e * s * f * j * function_stack 00:00:08 v #59 > > | ENFJ : e * n * f * j * function_stack 00:00:08 v #60 > > | ENTJ : e * n * t * j * function_stack 00:00:08 v #61 > > 00:00:08 v #62 > > 00:00:08 v #63 > > inl main () = 00:00:08 v #64 > > inl istj_stack = FS ((Si (s, i)), Ne (n, e), (Te (t, e)), (Fi (f, i))) 00:00:08 v #65 > > inl istj_personality = ISTJ (i, s, t, j, istj_stack) 00:00:08 v #66 > > // inl isfj_stack = FS ((Si (s, i)), Ne (n, e), (Fe (f, e)), (Ti (t, i))) 00:00:08 v #67 > > // inl isfj_personality = ISFJ (i, s, f, j, isfj_stack) 00:00:08 v #68 > > 00:00:08 v #69 > > ;[[ 00:00:08 v #70 > > istj_personality 00:00:08 v #71 > > ]] 00:00:08 v #72 > > |> fun x => $'$"%A{!x}"' : string 00:00:08 v #73 > > |> console.write_line 00:00:08 v #74 > > 00:00:08 v #75 > > inl main () = 00:00:08 v #76 > > $'!main ()' : () 00:00:09 v #77 > > 00:00:09 v #78 > > ╭─[ 1.29s - stdout ]───────────────────────────────────────────────────────────╮ 00:00:09 v #79 > > │ [|US5_0 (US4_0 (US0_0, US1_1, US2_1, US3_0))|] │ 00:00:09 v #80 > > │ │ 00:00:09 v #81 > > ╰──────────────────────────────────────────────────────────────────────────────╯ 00:00:10 v #82 > > 00:00:10 v #83 > > ── fsharp ────────────────────────────────────────────────────────────────────── 00:00:10 v #84 > > type PhonologicalFeature = 00:00:10 v #85 > > | VowelFeature of 00:00:10 v #86 > > height: Height 00:00:10 v #87 > > * backness: Backness 00:00:10 v #88 > > * roundedness: Roundedness 00:00:10 v #89 > > * tone: Option<Tone> 00:00:10 v #90 > > * stress: Option<Stress> 00:00:10 v #91 > > * length: Option<Length> 00:00:10 v #92 > > | ConsonantFeature of 00:00:10 v #93 > > place: PlaceOfArticulation 00:00:10 v #94 > > * manner: MannerOfArticulation 00:00:10 v #95 > > * voicing: Voicing 00:00:10 v #96 > > * length: Option<Length> 00:00:10 v #97 > > | VowelHarmonyFeature 00:00:10 v #98 > > | PitchAccentFeature 00:00:10 v #99 > > 00:00:10 v #100 > > and Stress = Primary | Secondary 00:00:10 v #101 > > and Length = Long | Short | HalfLong 00:00:10 v #102 > > 00:00:10 v #103 > > and Height = 00:00:10 v #104 > > | High | NearHigh | HighMid 00:00:10 v #105 > > | Mid | LowMid | NearLow 00:00:10 v #106 > > | Low 00:00:10 v #107 > > 00:00:10 v #108 > > and Backness = Front | Central | Back 00:00:10 v #109 > > 00:00:10 v #110 > > and Roundedness = Rounded | Unrounded 00:00:10 v #111 > > 00:00:10 v #112 > > and PlaceOfArticulation = 00:00:10 v #113 > > | Bilabial | Labiodental | Dental 00:00:10 v #114 > > | Alveolar | Postalveolar | Retroflex 00:00:10 v #115 > > | Palatal | Velar | Uvular 00:00:10 v #116 > > | Pharyngeal | Epiglottal | Glottal 00:00:10 v #117 > > 00:00:10 v #118 > > and MannerOfArticulation = 00:00:10 v #119 > > | Plosive | Nasal | Trill 00:00:10 v #120 > > | TapOrFlap | Fricative | LateralFricative 00:00:10 v #121 > > | Approximant | LateralApproximant 00:00:10 v #122 > > 00:00:10 v #123 > > and Voicing = Voiced | Voiceless 00:00:10 v #124 > > 00:00:10 v #125 > > and SecondaryArticulation = 00:00:10 v #126 > > | Labialization | Palatalization | Velarization 00:00:10 v #127 > > | Pharyngealization | Aspiration 00:00:10 v #128 > > 00:00:10 v #129 > > and Tone = 00:00:10 v #130 > > | LevelTone of int 00:00:10 v #131 > > | ContourTone of int list 00:00:10 v #132 > > 00:00:10 v #133 > > and MorphologicalFeature = 00:00:10 v #134 > > | RootFeature of string 00:00:10 v #135 > > | AffixFeature of AffixType * string 00:00:10 v #136 > > | IncorporationFeature of string * MorphologicalFeature 00:00:10 v #137 > > | NonConcatenativePattern of string * string 00:00:10 v #138 > > | AgglutinativeAffixFeature of AgglutinativeAffixType * string 00:00:10 v #139 > > | HonorificFeature of HonorificType * string 00:00:10 v #140 > > 00:00:10 v #141 > > and AgglutinativeAffixType = Suffix | Prefix 00:00:10 v #142 > > 00:00:10 v #143 > > and HonorificType = VerbHonorific | NounHonorific 00:00:10 v #144 > > 00:00:10 v #145 > > and AffixType = 00:00:10 v #146 > > | Prefix | Suffix | Infix 00:00:10 v #147 > > | Circumfix 00:00:10 v #148 > > 00:00:10 v #149 > > type SyntacticFeature = 00:00:10 v #150 > > | WordFeature of MorphologicalFeature list * LexicalCategory 00:00:10 v #151 > > | PhraseFeature of PhraseType * SyntacticFeature list 00:00:10 v #152 > > | GrammaticalRelation of GrammaticalRelationType * SyntacticFeature list 00:00:10 v #153 > > | SOVOrderFeature 00:00:10 v #154 > > | TopicCommentFeature 00:00:10 v #155 > > 00:00:10 v #156 > > and GrammaticalRelationType = 00:00:10 v #157 > > | Ergative | Absolutive | Nominative 00:00:10 v #158 > > | Accusative 00:00:10 v #159 > > 00:00:10 v #160 > > and LexicalCategory = 00:00:10 v #161 > > | Noun | Verb | Adjective 00:00:10 v #162 > > | Adverb | Pronoun | Preposition 00:00:10 v #163 > > | Conjunction | Determiner | Interjection 00:00:10 v #164 > > 00:00:10 v #165 > > and PhraseType = 00:00:10 v #166 > > | NP | VP | AP 00:00:10 v #167 > > | PP | CP 00:00:10 v #168 > > 00:00:10 v #169 > > and SemanticFeature = 00:00:10 v #170 > > | Meaning of string 00:00:10 v #171 > > | SemanticRole of SemanticRoleType * SemanticFeature 00:00:10 v #172 > > 00:00:10 v #173 > > and SemanticRoleType = 00:00:10 v #174 > > | Agent | Patient | Instrument 00:00:10 v #175 > > | Location | Time | Cause 00:00:10 v #176 > > 00:00:10 v #177 > > and PragmaticFeature = 00:00:10 v #178 > > | UseContext of string 00:00:10 v #179 > > | PolitenessLevel of Politeness 00:00:10 v #180 > > | SpeechAct of SpeechActType 00:00:10 v #181 > > | SpeechLevel of SpeechLevelType 00:00:10 v #182 > > 00:00:10 v #183 > > and Politeness = Formal | Informal | Neutral 00:00:10 v #184 > > 00:00:10 v #185 > > and SpeechActType = 00:00:10 v #186 > > | Assertive | Directive | Commissive 00:00:10 v #187 > > | Expressive | Declarative 00:00:10 v #188 > > 00:00:10 v #189 > > and SpeechLevelType = 00:00:10 v #190 > > | FormalHigh | FormalLow | InformalHigh 00:00:10 v #191 > > | InformalLow | Neutral 00:00:10 v #192 > > 00:00:10 v #193 > > type LinguisticFeature = 00:00:10 v #194 > > | Phonological of PhonologicalFeature 00:00:10 v #195 > > | Morphological of MorphologicalFeature 00:00:10 v #196 > > | Syntactic of SyntacticFeature 00:00:10 v #197 > > | Semantic of SemanticFeature 00:00:10 v #198 > > | Pragmatic of PragmaticFeature 00:00:10 v #199 > > 00:00:10 v #200 > > type LanguageConstruct = 00:00:10 v #201 > > | LanguageElement of LinguisticFeature 00:00:10 v #202 > > | LanguageStructure of LanguageConstruct list 00:00:10 v #203 > > | TranslationElement of TranslationFeature 00:00:10 v #204 > > 00:00:10 v #205 > > and TranslationFeature = 00:00:10 v #206 > > | LinkedPhonological of PhonologicalFeature * PhonologicalFeature 00:00:10 v #207 > > | LinkedMorphological of MorphologicalFeature * MorphologicalFeature 00:00:10 v #208 > > | LinkedSyntactic of SyntacticFeature * SyntacticFeature 00:00:10 v #209 > > | LinkedSemantic of SemanticFeature * SemanticFeature 00:00:10 v #210 > > 00:00:10 v #211 > > type Discourse = DiscourseUnit of LanguageConstruct list 00:00:10 v #212 > > 00:00:10 v #213 > > type LanguageModel = 00:00:10 v #214 > > | Model of discourse: Discourse 00:00:11 v #215 > > 00:00:11 v #216 > > ── fsharp ────────────────────────────────────────────────────────────────────── 00:00:11 v #217 > > let testEnglish = 00:00:11 v #218 > > Model( 00:00:11 v #219 > > DiscourseUnit [[ 00:00:11 v #220 > > LanguageElement (Phonological (ConsonantFeature (Alveolar, Nasal, 00:00:11 v #221 > > Voiced, Some(HalfLong)))); 00:00:11 v #222 > > LanguageElement (Phonological (VowelFeature (High, Front, Unrounded, 00:00:11 v #223 > > Some(LevelTone 1), Some(Primary), Some(Short)))); 00:00:11 v #224 > > LanguageElement (Phonological (VowelFeature (Low, Front, Unrounded, 00:00:11 v #225 > > Some(LevelTone 2), Some(Secondary), Some(Long)))); 00:00:11 v #226 > > LanguageElement (Phonological (ConsonantFeature (Velar, Plosive, 00:00:11 v #227 > > Voiceless, Some(HalfLong)))); 00:00:11 v #228 > > LanguageElement (Morphological (RootFeature "I")); 00:00:11 v #229 > > LanguageElement (Morphological (RootFeature "see")); 00:00:11 v #230 > > LanguageElement (Morphological (RootFeature "a")); 00:00:11 v #231 > > LanguageElement (Morphological (RootFeature "cat")); 00:00:11 v #232 > > LanguageElement (Syntactic (PhraseFeature (NP, [[WordFeature 00:00:11 v #233 > > ([[RootFeature "I"]], Pronoun)]]))); 00:00:11 v #234 > > LanguageElement (Syntactic (PhraseFeature (VP, [[WordFeature 00:00:11 v #235 > > ([[RootFeature "see"]], Verb)]]))); 00:00:11 v #236 > > LanguageElement (Syntactic (PhraseFeature (NP, [[WordFeature 00:00:11 v #237 > > ([[RootFeature "a"; RootFeature "cat"]], Noun)]]))); 00:00:11 v #238 > > LanguageElement (Semantic (Meaning "Perception act of a feline by 00:00:11 v #239 > > the speaker")); 00:00:11 v #240 > > LanguageElement (Pragmatic (UseContext "Statement of an action being 00:00:11 v #241 > > observed")) 00:00:11 v #242 > > ]] 00:00:11 v #243 > > ) 00:00:11 v #244 > > 00:00:11 v #245 > > let testPortuguese = 00:00:11 v #246 > > Model( 00:00:11 v #247 > > DiscourseUnit [[ 00:00:11 v #248 > > LanguageElement (Phonological (VowelFeature (High, Front, Unrounded, 00:00:11 v #249 > > Some(LevelTone 1), Some(Primary), Some(Short)))); 00:00:11 v #250 > > LanguageElement (Phonological (VowelFeature (Low, Front, Unrounded, 00:00:11 v #251 > > Some(LevelTone 2), Some(Secondary), Some(Long)))); 00:00:11 v #252 > > LanguageElement (Phonological (VowelFeature (Mid, Back, Rounded, 00:00:11 v #253 > > Some(LevelTone 3), Some(Primary), Some(Short)))); 00:00:11 v #254 > > LanguageElement (Phonological (ConsonantFeature (Velar, Plosive, 00:00:11 v #255 > > Voiceless, Some(HalfLong)))); 00:00:11 v #256 > > LanguageElement (Morphological (RootFeature "Eu")); 00:00:11 v #257 > > LanguageElement (Morphological (RootFeature "ver" |> ignore; 00:00:11 v #258 > > AffixFeature (Suffix, "o"))); 00:00:11 v #259 > > LanguageElement (Morphological (RootFeature "um")); 00:00:11 v #260 > > LanguageElement (Morphological (RootFeature "gato")); 00:00:11 v #261 > > LanguageElement (Syntactic (PhraseFeature (NP, [[WordFeature 00:00:11 v #262 > > ([[RootFeature "Eu"]], Pronoun)]]))); 00:00:11 v #263 > > LanguageElement (Syntactic (PhraseFeature (VP, [[WordFeature 00:00:11 v #264 > > ([[RootFeature "vejo"]], Verb)]]))); 00:00:11 v #265 > > LanguageElement (Syntactic (PhraseFeature (NP, [[WordFeature 00:00:11 v #266 > > ([[RootFeature "um"; RootFeature "gato"]], Noun)]]))); 00:00:11 v #267 > > LanguageElement (Semantic (Meaning "Ação de percepção de um felino 00:00:11 v #268 > > pelo falante")); 00:00:11 v #269 > > LanguageElement (Pragmatic (UseContext "Declaração de uma ação sendo 00:00:11 v #270 > > observada")) 00:00:11 v #271 > > ]] 00:00:11 v #272 > > ) 00:00:11 v #273 > > 00:00:11 v #274 > > let testKorean = 00:00:11 v #275 > > Model( 00:00:11 v #276 > > DiscourseUnit [[ 00:00:11 v #277 > > LanguageElement (Phonological (ConsonantFeature (Alveolar, Nasal, 00:00:11 v #278 > > Voiced, Some(Short)))); 00:00:11 v #279 > > LanguageElement (Phonological (VowelFeature (High, Back, Rounded, 00:00:11 v #280 > > None, None, Some(Short)))); 00:00:11 v #281 > > LanguageElement (Phonological (VowelFeature (Mid, Front, Unrounded, 00:00:11 v #282 > > None, None, Some(Long)))); 00:00:11 v #283 > > LanguageElement (Phonological (ConsonantFeature (Bilabial, Plosive, 00:00:11 v #284 > > Voiceless, Some(Short)))); 00:00:11 v #285 > > LanguageElement (Morphological (RootFeature "나")); 00:00:11 v #286 > > LanguageElement (Morphological (RootFeature "보다")); 00:00:11 v #287 > > LanguageElement (Morphological (AffixFeature (Suffix, "아"))); 00:00:11 v #288 > > LanguageElement (Morphological (RootFeature "고양이")); 00:00:11 v #289 > > LanguageElement (Syntactic (PhraseFeature (NP, [[WordFeature 00:00:11 v #290 > > ([[RootFeature "나"]], Pronoun)]]))); 00:00:11 v #291 > > LanguageElement (Syntactic (PhraseFeature (VP, [[WordFeature 00:00:11 v #292 > > ([[RootFeature "보다"; AffixFeature (Suffix, "아")]], Verb)]]))); 00:00:11 v #293 > > LanguageElement (Syntactic (PhraseFeature (NP, [[WordFeature 00:00:11 v #294 > > ([[RootFeature "고양이"]], Noun)]]))); 00:00:11 v #295 > > LanguageElement (Semantic (Meaning "화자에 의한 고양이의 관찰 00:00:11 v #296 > > 행위")); 00:00:11 v #297 > > LanguageElement (Pragmatic (UseContext "관찰되고 있는 행동의 진술")) 00:00:11 v #298 > > ]] 00:00:11 v #299 > > ) 00:00:11 v #300 > > 00:00:11 v #301 > > ── markdown ──────────────────────────────────────────────────────────────────── 00:00:11 v #302 > > ╭──────────────────────────────────────────────────────────────────────────────╮ 00:00:11 v #303 > > │ ## main │ 00:00:11 v #304 > > ╰──────────────────────────────────────────────────────────────────────────────╯ 00:00:11 v #305 > > 00:00:11 v #306 > > ── spiral ────────────────────────────────────────────────────────────────────── 00:00:11 v #307 > > inl main (_args : array_base string) = 00:00:11 v #308 > > 0i32 00:00:11 v #309 > > 00:00:11 v #310 > > inl main () = 00:00:11 v #311 > > $'let main args = !main args' : () 00:00:11 v #312 > > 00:00:11 v #313 > > ── spiral ────────────────────────────────────────────────────────────────────── 00:00:11 v #314 > > inl app () = 00:00:11 v #315 > > "test" |> console.write_line 00:00:11 v #316 > > 0i32 00:00:11 v #317 > > 00:00:11 v #318 > > inl main () = 00:00:11 v #319 > > print_static "<test>" 00:00:11 v #320 > > 00:00:11 v #321 > > app 00:00:11 v #322 > > |> dyn 00:00:11 v #323 > > |> ignore 00:00:11 v #324 > > 00:00:11 v #325 > > print_static "</test>" 00:00:12 v #326 > 00:00:11 v #3 runtime.execute_with_options / result / { exit_code = 0; std_trace_length = 11263 } 00:00:12 v #327 > 00:00:11 d #4 runtime.execute_with_options / { file_name = jupyter; arguments = ["nbconvert", "/home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.dib.ipynb", "--to", "html", "--HTMLExporter.theme=dark"]; options = { command = jupyter nbconvert "/home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.dib.ipynb" --to html --HTMLExporter.theme=dark; cancellation_token = None; environment_variables = Array(MutCell([])); on_line = None; stdin = None; trace = true; working_directory = None } } 00:00:12 v #328 > 00:00:12 v #5 ! [NbConvertApp] Converting notebook /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.dib.ipynb to html 00:00:12 v #329 > 00:00:12 v #6 ! /opt/hostedtoolcache/Python/3.12.7/x64/lib/python3.12/site-packages/nbformat/__init__.py:96: MissingIDFieldWarning: Cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. 00:00:12 v #330 > 00:00:12 v #7 ! validate(nb) 00:00:13 v #331 > 00:00:12 v #8 ! /opt/hostedtoolcache/Python/3.12.7/x64/lib/python3.12/site-packages/nbconvert/filters/highlight.py:71: UserWarning: IPython3 lexer unavailable, falling back on Python 3 00:00:13 v #332 > 00:00:12 v #9 ! return _pygments_highlight( 00:00:13 v #333 > 00:00:12 v #10 ! [NbConvertApp] Writing 318991 bytes to /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.dib.html 00:00:13 v #334 > 00:00:12 v #11 runtime.execute_with_options / result / { exit_code = 0; std_trace_length = 914 } 00:00:13 v #335 > 00:00:12 d #12 spiral_builder.run / dib / jupyter nbconvert / { exit_code = 0; jupyter_result_length = 914 } 00:00:13 v #336 > 00:00:12 d #13 runtime.execute_with_options / { file_name = pwsh; arguments = ["-c", "$counter = 1; $path = '/home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.dib.html'; (Get-Content $path -Raw) -replace '(id=\\\"cell-id=)[a-fA-F0-9]{8}', { $_.Groups[1].Value + $counter++ } | Set-Content $path"]; options = { command = pwsh -c "$counter = 1; $path = '/home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.dib.html'; (Get-Content $path -Raw) -replace '(id=\"cell-id=)[a-fA-F0-9]{8}', { $_.Groups[1].Value + $counter++ } | Set-Content $path"; cancellation_token = None; environment_variables = Array(MutCell([])); on_line = None; stdin = None; trace = true; working_directory = None } } 00:00:13 v #337 > 00:00:13 v #14 runtime.execute_with_options / result / { exit_code = 0; std_trace_length = 0 } 00:00:13 v #338 > 00:00:13 d #15 spiral_builder.run / dib / html cell ids / { exit_code = 0; pwsh_replace_html_result_length = 0 } 00:00:13 v #339 > 00:00:13 d #16 spiral_builder.run / dib / { exit_code = 0; result_length = 12236 } 00:00:13 d #340 runtime.execute_with_options_async / { exit_code = 0; output_length = 15637 } 00:00:13 d #1 main / executeCommand / exitCode: 0 / command: ../../../../workspace/target/release/spiral_builder dib --path test.dib --retries 3
parse the .dib file into .spi format with dibparser¶
In [ ]:
{ . ../../../../apps/parser/dist/DibParser$(_exe) test.dib spi } | Invoke-Block
00:00:00 d #1 writeDibCode / output: Spi / path: test.dib 00:00:00 d #2 parseDibCode / output: Spi / file: test.dib
build .fsx file from .spi using supervisor¶
In [ ]:
{ . ../../../../apps/spiral/dist/Supervisor$(_exe) --build-file test.spi test.fsx } | Invoke-Block
00:00:00 v #1 networking.test_port_open / { port = 13806; ex = System.AggregateException: One or more errors occurred. (Connection refused) } 00:00:00 v #2 networking.test_port_open / { port = 13806; ex = System.AggregateException: One or more errors occurred. (Connection refused) } 00:00:00 d #1 Supervisor.buildFile / takeWhileInclusive / outputContent: / errors: [] / typeErrorCount: 0 / retry: 0 / path: test.spi 00:00:00 d #2 Supervisor.buildFile / AsyncSeq.scan / outputContent: / errors: [] / outputContentResult: / typeErrorCount: 0 / retry: 0 / error: / path: test.spi 00:00:00 d #3 Supervisor.buildFile / takeWhileInclusive / outputContent: / errors: [] / typeErrorCount: 0 / retry: 0 / path: test.spi 00:00:00 v #4 Supervisor.sendJson / port: 13805 / json: {"FileOpen":{"spiText":"/// # test (Polyglot)\nnominal i = ()\nnominal e = ()\nnominal s = ()\nnomin...t\u003E\u0022\n","uri":"file:///home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.spi"}} / result: 00:00:00 v #5 Supervisor.sendJson / port: 13805 / json: {"BuildFile":{"backend":"Fsharp","uri":"file:///home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.spi"}} / result: 00:00:01 d #6 Supervisor.buildFile / AsyncSeq.scan / outputContent: let rec closure1 () () : unit = let v0 : (string -> unit) = System.Console.WriteLine let v1 : string = "test" v0 v1 and closure0 () () : i...t v0 : unit = () let v1 : (unit -> unit) = closure1() let v2 : unit = (fun () -> v1 (); v0) () 0 let v0 : (unit -> int32) = closure0() () / errors: [] / outputContentResult: / typeErrorCount: 0 / retry: 0 / error: / path: test.spi 00:00:01 d #7 Supervisor.buildFile / takeWhileInclusive / outputContent: let rec closure1 () () : unit = let v0 : (string -> unit) = System.Console.WriteLine let v1 : string = "test" v0 v1 and closure0 () () : i...t v0 : unit = () let v1 : (unit -> unit) = closure1() let v2 : unit = (fun () -> v1 (); v0) () 0 let v0 : (unit -> int32) = closure0() () / errors: [] / typeErrorCount: 0 / retry: 0 / path: test.spi 00:00:01 d #8 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite
compile and format the project¶
compile project with fable targeting optimized rust¶
In [ ]:
dotnet fable --optimize --lang rs --extension .rs
Fable 4.21.0: F# to Rust compiler (status: alpha) Thanks to the contributor! @cannorin Stand with Ukraine! https://standwithukraine.com.ua/ Parsing test.fsproj... .> dotnet restore test.fable-temp.csproj -p:FABLE_COMPILER=true -p:FABLE_COMPILER_4=true -p:FABLE_COMPILER_RUST=true Determining projects to restore... Paket version 8.1.0-alpha004+7aa412f49b32de979c3d5acde07e88e6d47c965b The last full restore is still up to date. Nothing left to do. Total time taken: 0 milliseconds Paket version 8.1.0-alpha004+7aa412f49b32de979c3d5acde07e88e6d47c965b Restoring /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.fable-temp.csproj Starting restore process. Total time taken: 0 milliseconds Restored /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.fable-temp.csproj (in 261 ms). .> dotnet restore /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.fsproj Determining projects to restore... Restored /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/test.fsproj (in 262 ms). Project and references (1 source files) parsed in 4665ms Started Fable compilation... Fable compilation finished in 1057ms ./test.fsx(11,0): (11,2) warning FABLE: For Rust, support for F# static and module do bindings is disabled by default. It can be enabled with the 'static_do_bindings' feature. Use at your own risk!
fix formatting issues in the .rs file using regex and set-content¶
In [ ]:
(Get-Content test.rs) `
-replace [regex]::Escape("),);"), "));" `
| FixRust `
| Set-Content test.rs
format the rust code using cargo fmt¶
In [ ]:
cargo fmt --
build and test the project¶
build the project in release mode using nightly rust compiler¶
In [ ]:
cargo build --release
Compiling syn v2.0.79 Compiling linux-raw-sys v0.4.14 Compiling rand_core v0.6.4 Compiling num-traits v0.2.19 Compiling once_cell v1.20.2 Compiling libm v0.2.8 Compiling wait-timeout v0.2.0 Compiling rustix v0.38.37 Compiling bit-vec v0.6.3 Compiling quick-error v1.2.3 Compiling bit-set v0.5.3 Compiling rand_xorshift v0.3.0 Compiling memchr v2.7.4 Compiling unarray v0.1.4 Compiling nom v7.1.3 Compiling fable_library_rust v0.1.0 (/home/runner/work/polyglot/polyglot/lib/rust/fable/fable_modules/fable-library-rust) Compiling zerocopy-derive v0.7.35 Compiling tempfile v3.13.0 Compiling zerocopy v0.7.35 Compiling rusty-fork v0.3.0 Compiling thiserror-impl v1.0.64 Compiling ppv-lite86 v0.2.20 Compiling thiserror v1.0.64 Compiling rand_chacha v0.3.1 Compiling rand v0.8.5 Compiling proptest v1.5.0 Compiling spiral_temp_test v0.0.1 (/home/runner/work/polyglot/polyglot/apps/spiral/temp/test) warning: struct `Cart` is never constructed --> /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/./main.rs:41:8 | 41 | struct Cart { | ^^^^ | = note: `#[warn(dead_code)]` on by default warning: associated items `new`, `add_item`, and `remove_item` are never used --> /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/./main.rs:46:8 | 45 | impl Cart { | --------- associated items in this implementation 46 | fn new() -> Cart { | ^^^ ... 50 | fn add_item(&mut self, item: Item) { | ^^^^^^^^ ... 56 | fn remove_item(&mut self, item: &Item) { | ^^^^^^^^^^^ warning: function `parse_comment` is never used --> /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/./main.rs:124:4 | 124 | fn parse_comment(input: &str) -> IResult<&str, SpiralToken> { | ^^^^^^^^^^^^^ warning: function `parse_string` is never used --> /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/./main.rs:130:4 | 130 | fn parse_string(input: &str) -> IResult<&str, SpiralToken> { | ^^^^^^^^^^^^ warning: function `parse_identifier` is never used --> /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/./main.rs:145:4 | 145 | fn parse_identifier(input: &str) -> IResult<&str, SpiralToken> { | ^^^^^^^^^^^^^^^^ warning: function `parse_integer` is never used --> /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/./main.rs:157:4 | 157 | fn parse_integer(input: &str) -> IResult<&str, SpiralToken> { | ^^^^^^^^^^^^^ warning: function `parse_operator` is never used --> /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/./main.rs:165:4 | 165 | fn parse_operator(input: &str) -> IResult<&str, SpiralToken> { | ^^^^^^^^^^^^^^ warning: function `parse_token` is never used --> /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/./main.rs:170:4 | 170 | fn parse_token(input: &str) -> IResult<&str, SpiralToken> { | ^^^^^^^^^^^ warning: function `format_token` is never used --> /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/./main.rs:180:4 | 180 | fn format_token(token: &SpiralToken) -> String { | ^^^^^^^^^^^^ warning: function `parse_expression` is never used --> /home/runner/work/polyglot/polyglot/apps/spiral/temp/test/./main.rs:201:4 | 201 | fn parse_expression(input: &str) -> IResult<&str, SpiralToken> { | ^^^^^^^^^^^^^^^^ warning: `spiral_temp_test` (bin "spiral_temp_test") generated 10 warnings Finished `release` profile [optimized] target(s) in 11.53s
run release tests with output enabled¶
In [ ]:
{ cargo test --release -- --show-output } | Invoke-Block
Compiling linux-raw-sys v0.4.14 Compiling zerocopy v0.7.35 Compiling bitflags v2.6.0 Compiling once_cell v1.20.2 Compiling fastrand v2.1.1 Compiling wait-timeout v0.2.0 Compiling rustix v0.38.37 Compiling bit-vec v0.6.3 Compiling fnv v1.0.7 Compiling quick-error v1.2.3 Compiling ppv-lite86 v0.2.20 Compiling bit-set v0.5.3 Compiling num-traits v0.2.19 Compiling rand_xorshift v0.3.0 Compiling lazy_static v1.5.0 Compiling minimal-lexical v0.2.1 Compiling rand_chacha v0.3.1 Compiling unarray v0.1.4 Compiling rand v0.8.5 Compiling memchr v2.7.4 Compiling fable_library_rust v0.1.0 (/home/runner/work/polyglot/polyglot/lib/rust/fable/fable_modules/fable-library-rust) Compiling thiserror v1.0.64 Compiling nom v7.1.3 Compiling tempfile v3.13.0 Compiling rusty-fork v0.3.0 Compiling proptest v1.5.0 Compiling spiral_temp_test v0.0.1 (/home/runner/work/polyglot/polyglot/apps/spiral/temp/test) Finished `release` profile [optimized] target(s) in 15.86s Running unittests main.rs (/home/runner/work/polyglot/polyglot/workspace/target/release/deps/spiral_temp_test-14bb6dec0267d27e) running 3 tests test test_parse_number ... ok test prop_parse_format_idempotent ... ok test adding_and_then_removing_an_item_from_the_cart_leaves_the_cart_unchanged ... ok successes: ---- prop_parse_format_idempotent stdout ---- input=StringLiteral("a9&fZN*8VUGY@9:[|Wm|'") input=Operator(")") input=Integer(-8042610005090965570) input=Identifier("hIHnl0") input=Integer(-4782055575331073755) input=Identifier("dYQ1") input=StringLiteral("i`QC~c&<") input=Identifier("a2cOvn3622240TK7pV5EY") input=Identifier("CuSG8I43OSyJ") input=Integer(-5396828557436386383) input=Identifier("sAszV8DG6") input=StringLiteral("Sp**D{") input=Comment("Ji.?Z{[^\"gQOP6#lEkBKH&M~'K?}1'w") input=Comment("$:WZc`5N)TW") input=Identifier("nkf5YN4e8tKzyj2bjb") input=StringLiteral("Q*]N?c=`p$RjSU{Ll`^J") input=Operator("=") input=StringLiteral("<B';`L0Q`$'<AD") input=Integer(-6907654938537973443) input=Comment("B\"D?TL/A\\$-;%") input=StringLiteral("h'fr,P7yH`F6`/y`") input=Comment("lKF%%3") input=Identifier("uR") input=Integer(-1208707350823701990) input=Identifier("cjed4gy97s2Nvl241U54I5t26") input=Identifier("ves91dZAF6Mozi46B13s2I3OnskoKyO") input=Identifier("WZD") input=Identifier("KDANIlFN9r1zde3bEAv99Azpnem85") input=Operator("=") input=Identifier("Fp") input=StringLiteral("duj.`d~1*WRX`P:eb") input=StringLiteral("`,]m?Yw.w=-:M$=0") input=StringLiteral("&:!W{64DhM=C.*~6'L,.CV") input=Identifier("e") input=Operator(")") input=StringLiteral("{HH=^~e|6ka,`,p2.<:j/H9v^>O.%^") input=Integer(-2629750690941120) input=Integer(-7405411790023018934) input=Comment("TNKU=yIZf{+.='") input=Operator("*") input=Comment("<O*#GJ$p Mi^yoG$f\"Q`q") input=Identifier("ue9dmx182YiQ3wAKQ3Y") input=Identifier("V2kn") input=Comment("fh+63d{=%EfI0\\3jdc>@ |*c/") input=StringLiteral("o|)VB}FF4??CG#3<lPf7 &e.?Q") input=StringLiteral(".N'}[R=L9<^Sns/-i?W?A=5???`ej") input=StringLiteral("$S:h4'vE&Tv<U:.]:W([I/`yE}%") input=Integer(-247279085298817059) input=Identifier("ap0U45LH0b5VOn39Yr5k05zE") input=Comment("=vYB}=:VId7~O)`,x6<") input=Integer(7439513000400508607) input=Integer(-2511584799677693803) input=Comment(".:YB**%d:+Fo$E\\5RW6x\\.0a=") input=StringLiteral("?@*") input=StringLiteral("%aa?I*^!+u,,%PZAb ,TC`n") input=Operator("(") input=StringLiteral("{d9y$6{/.%//]3aQD5<?z6q4$}MP%") input=Identifier("GtnwFIOuvLGNDdHdENJ2Ug") input=Identifier("lF351X8Q2EGNU2ndU") input=Integer(1850253039169816075) input=Integer(-7485915676787083010) input=StringLiteral("_';.Z/Q/B=Li04xK3|VIK") input=Operator("*") input=Operator("*") input=Identifier("N0b198jz2") input=Operator("/") input=Integer(7139907419187924539) input=Identifier("D5") input=Operator("+") input=Integer(-3496215579408926042) input=Operator("+") input=Integer(4986830807536130654) input=Integer(1080701987715844584) input=Operator("-") input=Comment("?`fZ{\"\\:z`/'") input=Comment("!KUNK:u*`6&F~<Vsi~|.V%nh\\&9x<") input=Comment("5:u='d'[*\\z D$&/i@[") input=StringLiteral("`s{") input=Comment("*5hlz%*?^{]:/`Po%U|b`s={?m/f") input=Integer(8324412677111399568) input=StringLiteral("t'xCs..('bZ=") input=Operator("+") input=StringLiteral("<n7DDU/=P:0+<H:N=L>/%$X//#X") input=Operator("*") input=Comment("<B&'[dAk@\\)5Z2+Zy'g{&&T%WJ{T'") input=StringLiteral("*~(?}i") input=Operator("-") input=Comment("|:??=L><nHn$=$]7|C(") input=Identifier("V6le8IQbi4H7Xa3I2Aju0") input=StringLiteral("{rcE=E^5+*") input=Comment("B<~\\z`X<=\\<h &w$/WOMw<lYD`/p=o") input=Integer(266069433581115945) input=Comment("d%<\\\\<5") input=Identifier("VWsAK2n5Wijy5") input=StringLiteral("F= `:") input=Comment("`:Eh-w:mIS7$E']R`@'?=") input=StringLiteral("=hCWke/v=&HM&AKQ*") input=Comment("q8gr=`\"") input=Operator("=") input=StringLiteral("h[D2(3:To:zK~{IK<?%.l^") input=Integer(-8189489006644729086) input=Identifier("fGq2rH226xXZ9RMxc5wo8D") input=Identifier("m72w4QId1BGyQN2i7Cc8892t9OWfg8dRJ") input=Identifier("Rk") input=Comment("\"l-`\"v2%E!L}=F%*C\\d7#8m.4R=%K") input=Identifier("CGIcG0ZB4QNVOmXAp33LEAnm4tOO9G") input=Identifier("z2") input=Comment("3{jz{A:ID]z:.\"V=`*`ouLhjH\\$.1") input=Comment("'O.\"") input=Identifier("HxzTsDKh4d") input=Comment("=\\Dn)x'2") input=Comment("Nzz@`B=<r8jP&<\\|%_y:kCO(") input=StringLiteral("2!*joap%mC") input=Comment("BRQ$'::;@Cd{~(Z\"e=]") input=StringLiteral("$^q[kjb{1F-%H*=2") input=Comment("4=-Tt:<p:&?j*RXI%A<K</t`e") input=Identifier("PomHyurQOrbz4GWEznhRNC") input=Comment("`=-#g,u=$lF?") input=Integer(-599629885987385286) input=Operator(")") input=Identifier("LU4Zg1M43CFVhxh84d9KX5H7") input=Operator("=") input=Comment("`g]{.%KC`J+jW%lY%us{{?\"uwZm") input=StringLiteral("=(?<vhCuq'Fud>") input=Operator("-") input=Operator("(") input=Identifier("GZ6YrqXNmdcGtZidExDL68") input=Identifier("nCrNRuR89qIf") input=Operator("+") input=StringLiteral("</g/'&48O'l:<./J8p&<Im& -D5>54") input=Integer(6772122121424214320) input=Operator("*") input=Comment("7F'{E'V*=k?/\"? .z<`") input=Identifier("s9ewr5KIlXAhcdt0v67O") input=Comment("%S? #\"~{v-Oc,{*%q.hL?'i$X%<)") input=Operator("+") input=Operator("=") input=Identifier("oMtIyi") input=Comment("\"\\*") input=StringLiteral("%v%9LQ*.:_cN{Sm>") input=Identifier("NoMZZI68EYtH012F") input=Comment("m\\c}<a=[A_'#:{%") input=Integer(2208364985708022403) input=StringLiteral("QZ`$.&") input=Comment("\\$$W|!PD'\\.QA;dah-!7mp") input=Identifier("EL86mbf89") input=Operator("/") input=Integer(-8778299263827936074) input=Comment("v$fOva5d%(%os,+m=$p(") input=Identifier("aXU2PXNzDHx4IV2uK164e6raIhx9rw") input=Comment("A/La6fwSH\"\"mP<\\<^[*") input=Integer(5437041633818860662) input=StringLiteral("qm?XRY&2(%1f/%&]*_U/g[?CWw") input=Operator("-") input=Comment("(g%") input=Identifier("f398b0bR") input=Comment("`&^U\"]=O\"}_{~6aS?") input=StringLiteral("C;z7riSe:+q<%vD{O'ha") input=Operator("-") input=Integer(-7962068163146670447) input=Operator("*") input=Operator("/") input=StringLiteral("2N>=QrX*APa&n|}") input=StringLiteral("TF*j_z4[`0B&N_3'djR/T0}lr") input=Integer(1392572693943934481) input=Identifier("CfK2Sz2o6Xc95cNFXZw354K") input=StringLiteral("H}~#=vsw{)R`:`%*q*{/8wt5") input=Comment("POu$mZJC +V_<H>V?'fzQ)\\") input=Integer(7618723947373156104) input=Operator("+") input=Operator("-") input=Identifier("B77T0") input=Identifier("mqqFhT52cm40VdZ0Ehb8L") input=Operator("/") input=Identifier("Llk95KU4JM2LJcPo7Qb66J1o7Am6vT") input=Integer(-4775355664782374246) input=Integer(-4896838126661309007) input=Integer(1515497140859105447) input=Integer(-546866743666433690) input=Identifier("Fbpo") input=Operator("+") input=Comment("av_ v\\|cQ{/X") input=Identifier("Bjw4Q") input=Operator("/") input=Comment("!)+%/?YJ<d({Y") input=Comment("e&o&I';gmU`F`*<*c\\_8-\\-*o<:$&=: ") input=StringLiteral("|/e|`ujt+uKf_$6W*$") input=Operator("=") input=Comment("`%\"H") input=Identifier("JVhccmJiYjI1LLgl9dKL2z2Am") input=Comment("'.sd!\"uT:E#iIK.=v0`o^%t ") input=Identifier("leWKR3fmE2") input=Identifier("RXYVi01Xn3C6nAKf3LNImEHed6am") input=Identifier("pIlBLUA0Wo1246xB3zTY46tCQp2j") input=Comment("\\A,h.wu</{6]ZsQkY*KuSB?R\\A:}wo") input=Operator("*") input=Identifier("J") input=Identifier("E") input=Operator("+") input=Integer(-2887524730164966690) input=Operator("(") input=Operator("(") input=Comment(">F4/&G") input=Comment("(z*") input=Comment("\"@`=x\"?5<?BW`N_\"!M$vKa") input=StringLiteral("?Q$H/)G=BJ") input=Integer(-542899746733617821) input=Integer(-1344892466486829904) input=StringLiteral("$zmuA5.$h+/") input=StringLiteral("V7Pcp:") input=Comment("6u") input=Integer(2019851728694554331) input=Identifier("A0tK3EIWV9bvg2") input=Comment("Ns?V$P{JNJ1&% ") input=Operator("(") input=Operator("(") input=Integer(-5812530680598048801) input=Operator(")") input=Comment("42SZrz\\G{%h*c;`4%{F") input=Integer(-7011786588623398075) input=Operator(")") input=Comment("Orc)&") input=StringLiteral("^=:h@.1!PS=-") input=Integer(-6135983524394549353) input=StringLiteral("") input=Comment("edbz1%Rf1=kFG-") input=Comment("I+Wi`?%6x?%p") input=Operator("/") input=StringLiteral("B,9:L7:}<~b?V=N&M") input=Comment("Ez4:l%") input=Integer(8730961256452410374) input=StringLiteral("k`C?{9l<z`5Uzo6&'") input=StringLiteral("k7/i&~Nc.") input=Comment("4**p7|*.ZY:9q\"C{v%?\"&<='?A5.~") input=StringLiteral("j=wIgP<a;g:%-%sd~V4+.V") input=Comment("p<<8S") input=StringLiteral("^") input=StringLiteral("`") input=Operator("=") input=Integer(-9024884833183176155) input=Comment("?JVDh_*:gu)lyKX``?l") input=StringLiteral("Ohe") input=Operator("*") input=Comment("dj/2r'_0cN:\"/%'\\Z$") input=Identifier("h3iJF456bzZRu3krgE1viC14h") input=Comment("rqFL-$L[\\<.y%DvS\"&/\"?E,$4&J/#Kw") input=StringLiteral("&<2") input=Operator("-") input=Operator(")") input=StringLiteral(" IuG=<__=/1&-/Vf$0+HQ") input=Integer(7256121436701237552) input=StringLiteral("Q?*h_{ h") input=Identifier("v1i09En7") input=Integer(-4390388690843233234) input=Operator("=") input=StringLiteral(".**l/E''`o") successes: adding_and_then_removing_an_item_from_the_cart_leaves_the_cart_unchanged prop_parse_format_idempotent test_parse_number test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s
execute the binary in release mode¶
In [ ]:
{ . $ScriptDir/../../../../workspace/target/release/spiral_temp_test$(_exe) } | Invoke-Block
app=test