myco 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/lib/myco/bootstrap/component.rb +2 -0
  3. data/lib/myco/bootstrap/evaluator.rb +58 -0
  4. data/lib/myco/bootstrap/instance.rb +1 -1
  5. data/lib/myco/bootstrap/meme.rb +4 -9
  6. data/lib/myco/bootstrap.my +1 -1
  7. data/lib/myco/bootstrap.my.rb +1 -1
  8. data/lib/myco/code_loader.rb +6 -1
  9. data/lib/myco/code_tools/AST/ArgumentAssembly.my +8 -12
  10. data/lib/myco/code_tools/AST/ArgumentAssembly.my.rb +12 -9
  11. data/lib/myco/code_tools/AST/ArrayAssembly.my +2 -3
  12. data/lib/myco/code_tools/AST/ArrayAssembly.my.rb +2 -5
  13. data/lib/myco/code_tools/AST/Block.my +4 -4
  14. data/lib/myco/code_tools/AST/Block.my.rb +3 -7
  15. data/lib/myco/code_tools/AST/BlockArgument.my +4 -5
  16. data/lib/myco/code_tools/AST/BlockArgument.my.rb +2 -5
  17. data/lib/myco/code_tools/AST/BlockLiteral.my +3 -4
  18. data/lib/myco/code_tools/AST/BlockLiteral.my.rb +6 -6
  19. data/lib/myco/code_tools/AST/BlockParameter.my +4 -11
  20. data/lib/myco/code_tools/AST/BlockParameter.my.rb +4 -13
  21. data/lib/myco/code_tools/AST/BranchOperator.my +2 -3
  22. data/lib/myco/code_tools/AST/BranchOperator.my.rb +4 -9
  23. data/lib/myco/code_tools/AST/ConstantAccess.my +11 -8
  24. data/lib/myco/code_tools/AST/ConstantAccess.my.rb +16 -12
  25. data/lib/myco/code_tools/AST/ConstantAssignment.my +13 -5
  26. data/lib/myco/code_tools/AST/ConstantAssignment.my.rb +16 -11
  27. data/lib/myco/code_tools/AST/ConstantDefine.my +2 -3
  28. data/lib/myco/code_tools/AST/ConstantDefine.my.rb +3 -7
  29. data/lib/myco/code_tools/AST/DeclareCategory.my +4 -14
  30. data/lib/myco/code_tools/AST/DeclareCategory.my.rb +20 -36
  31. data/lib/myco/code_tools/AST/DeclareDecorator.my +2 -3
  32. data/lib/myco/code_tools/AST/DeclareDecorator.my.rb +3 -7
  33. data/lib/myco/code_tools/AST/DeclareExtension.my +22 -0
  34. data/lib/myco/code_tools/AST/DeclareExtension.my.rb +19 -0
  35. data/lib/myco/code_tools/AST/DeclareFile.my +4 -15
  36. data/lib/myco/code_tools/AST/DeclareFile.my.rb +34 -50
  37. data/lib/myco/code_tools/AST/DeclareMeme.my +5 -7
  38. data/lib/myco/code_tools/AST/DeclareMeme.my.rb +8 -17
  39. data/lib/myco/code_tools/AST/DeclareObject.my +6 -18
  40. data/lib/myco/code_tools/AST/DeclareObject.my.rb +41 -59
  41. data/lib/myco/code_tools/AST/DeclareString.my +2 -3
  42. data/lib/myco/code_tools/AST/DeclareString.my.rb +3 -7
  43. data/lib/myco/code_tools/AST/{MycoModuleScope.my → DeclaredScope.my} +15 -16
  44. data/lib/myco/code_tools/AST/{MycoModuleScope.my.rb → DeclaredScope.my.rb} +15 -20
  45. data/lib/myco/code_tools/AST/Invoke.my +8 -8
  46. data/lib/myco/code_tools/AST/Invoke.my.rb +13 -21
  47. data/lib/myco/code_tools/AST/InvokeMethod.my +2 -3
  48. data/lib/myco/code_tools/AST/InvokeMethod.my.rb +4 -9
  49. data/lib/myco/code_tools/AST/KeywordAssembly.my +3 -4
  50. data/lib/myco/code_tools/AST/KeywordAssembly.my.rb +2 -5
  51. data/lib/myco/code_tools/AST/KeywordOptionalParameter.my +16 -0
  52. data/lib/myco/code_tools/AST/KeywordOptionalParameter.my.rb +14 -0
  53. data/lib/myco/code_tools/AST/KeywordRequiredParameter.my +16 -0
  54. data/lib/myco/code_tools/AST/KeywordRequiredParameter.my.rb +13 -0
  55. data/lib/myco/code_tools/AST/KeywordRestParameter.my +16 -0
  56. data/lib/myco/code_tools/AST/KeywordRestParameter.my.rb +13 -0
  57. data/lib/myco/code_tools/AST/LocalVariableAccessAmbiguous.my +2 -3
  58. data/lib/myco/code_tools/AST/LocalVariableAccessAmbiguous.my.rb +2 -5
  59. data/lib/myco/code_tools/AST/LocalVariableAssignment.my +3 -3
  60. data/lib/myco/code_tools/AST/LocalVariableAssignment.my.rb +3 -7
  61. data/lib/myco/code_tools/AST/Node.my +32 -2
  62. data/lib/myco/code_tools/AST/Node.my.rb +34 -1
  63. data/lib/myco/code_tools/AST/NumericLiteral.my +15 -0
  64. data/lib/myco/code_tools/AST/NumericLiteral.my.rb +12 -0
  65. data/lib/myco/code_tools/AST/OptionalParameter.my +24 -0
  66. data/lib/myco/code_tools/AST/OptionalParameter.my.rb +19 -0
  67. data/lib/myco/code_tools/AST/ParameterAssembly.my +60 -103
  68. data/lib/myco/code_tools/AST/ParameterAssembly.my.rb +60 -121
  69. data/lib/myco/code_tools/AST/PipeOperator.my +2 -3
  70. data/lib/myco/code_tools/AST/PipeOperator.my.rb +3 -7
  71. data/lib/myco/code_tools/AST/Quest.my +8 -10
  72. data/lib/myco/code_tools/AST/Quest.my.rb +9 -13
  73. data/lib/myco/code_tools/AST/RequiredParameter.my +12 -0
  74. data/lib/myco/code_tools/AST/RequiredParameter.my.rb +10 -0
  75. data/lib/myco/code_tools/AST/RestParameter.my +12 -0
  76. data/lib/myco/code_tools/AST/RestParameter.my.rb +10 -0
  77. data/lib/myco/code_tools/AST/Script.my +4 -4
  78. data/lib/myco/code_tools/AST/Script.my.rb +3 -7
  79. data/lib/myco/code_tools/AST/Sequence.my +2 -3
  80. data/lib/myco/code_tools/AST/Sequence.my.rb +2 -5
  81. data/lib/myco/code_tools/AST/SplatValue.my +3 -4
  82. data/lib/myco/code_tools/AST/SplatValue.my.rb +2 -5
  83. data/lib/myco/code_tools/AST/{DynamicString.my → StringCompose.my} +3 -4
  84. data/lib/myco/code_tools/AST/{DynamicString.my.rb → StringCompose.my.rb} +4 -7
  85. data/lib/myco/code_tools/AST/StringLiteral.my +2 -3
  86. data/lib/myco/code_tools/AST/StringLiteral.my.rb +2 -5
  87. data/lib/myco/code_tools/AST/{DynamicSymbol.my → SymbolCompose.my} +3 -4
  88. data/lib/myco/code_tools/AST/{DynamicSymbol.my.rb → SymbolCompose.my.rb} +4 -7
  89. data/lib/myco/code_tools/AST/SymbolLiteral.my +2 -3
  90. data/lib/myco/code_tools/AST/SymbolLiteral.my.rb +2 -5
  91. data/lib/myco/code_tools/AST/ToRuby.my +40 -57
  92. data/lib/myco/code_tools/AST/ToRuby.my.rb +43 -52
  93. data/lib/myco/code_tools/AST/misc.my +19 -24
  94. data/lib/myco/code_tools/AST/misc.my.rb +18 -23
  95. data/lib/myco/code_tools/AST.my +17 -8
  96. data/lib/myco/code_tools/AST.my.rb +14 -7
  97. data/lib/myco/code_tools/Parser.my +1 -1
  98. data/lib/myco/code_tools/parser/MycoBuilder.my +3 -3
  99. data/lib/myco/code_tools/parser/MycoBuilder.my.rb +3 -3
  100. data/lib/myco/code_tools/parser/MycoGrammar.my +67 -74
  101. data/lib/myco/code_tools/parser/MycoGrammar.my.rb +211 -316
  102. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeHelpers.my +3 -3
  103. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeHelpers.my.rb +2 -2
  104. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeInstructions.my +9 -9
  105. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeInstructions.my.rb +9 -9
  106. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeParser.my +2 -2
  107. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeParser.my.rb +4 -1
  108. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Grammar.my +2 -3
  109. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Grammar.my.rb +2 -3
  110. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Machine.my +1 -1
  111. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Machine.my.rb +1 -1
  112. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Processor.my +5 -5
  113. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Processor.my.rb +5 -5
  114. data/lib/myco/command.my +1 -1
  115. data/lib/myco/command.my.rb +1 -1
  116. data/lib/myco/core/BasicDecorators.my +10 -8
  117. data/lib/myco/core/BasicDecorators.my.rb +7 -7
  118. data/lib/myco/core/BasicObject.my +38 -7
  119. data/lib/myco/core/BasicObject.my.rb +23 -4
  120. data/lib/myco/tools/BasicCommand.my +1 -1
  121. data/lib/myco/tools/BasicCommand.my.rb +1 -1
  122. data/lib/myco/version.rb +1 -1
  123. data/lib/myco.rb +3 -0
  124. metadata +41 -26
  125. data/lib/myco/code_tools/AST/ConstantReopen.my +0 -29
  126. data/lib/myco/code_tools/AST/ConstantReopen.my.rb +0 -35
@@ -42,8 +42,8 @@ rule meme_expr:
42
42
  rule arg_expr:
43
43
  assignment
44
44
  / left_chained_operations
45
- / dyn_string
46
- / dyn_symstr
45
+ / string_compose
46
+ / symbol_compose
47
47
  / left_chained_piping
48
48
  / expr_atom
49
49
 
@@ -96,9 +96,9 @@ rule lit_simple:
96
96
  / r(T.true[:t0]) { ast.true(t0) }
97
97
  / r(T.false[:t0]) { ast.false(t0) }
98
98
  / r(T.self[:t0]) { ast.self(t0) }
99
- / r(T.float[:t0]) { ast.lit(t0, t0.float) }
100
- / r(T.integer[:t0]) { ast.lit(t0, t0.integer) }
101
- / r(T.symbol[:t0]) { ast.lit(t0, t0.text.slice(::Range.new(1,-1)).to_sym) } # TODO: more succinct here
99
+ / r(T.float[:t0]) { ast.numeric(t0, t0.float) }
100
+ / r(T.integer[:t0]) { ast.numeric(t0, t0.integer) }
101
+ / r(T.symbol[:t0]) { ast.symbol(t0, t0.text.slice(Range.new(1,-1)).to_sym) } # TODO: more succinct here
102
102
 
103
103
  ##
104
104
  # Other literals
@@ -120,39 +120,39 @@ rule block_body:
120
120
  rule lit_string:
121
121
  r((T.string_begin + T.string_body[:tb] + T.string_end) /
122
122
  (T.sstring_begin + T.sstring_body[:tb] + T.sstring_end))
123
- { ast.lit(tb, encode_escapes(tb.text)) }
123
+ { ast.symbol(tb, encode_escapes(tb.text)) }
124
124
 
125
125
  rule lit_string_as_symbol:
126
126
  r((T.string_begin + T.string_body[:tb] + T.string_end) /
127
127
  (T.sstring_begin + T.sstring_body[:tb] + T.sstring_end))
128
- { ast.lit(tb, encode_escapes(tb.text).to_sym) }
128
+ { ast.symbol(tb, encode_escapes(tb.text).to_sym) }
129
129
 
130
130
  rule lit_symstr:
131
131
  r(T.symstr_begin + T.string_body[:tb] + T.string_end)
132
- { ast.lit(tb, encode_escapes(tb.text).to_sym) }
132
+ { ast.symbol(tb, encode_escapes(tb.text).to_sym) }
133
133
 
134
134
  rule category_name:
135
135
  r(T.catgry_begin + T.catgry_body[:tb] + T.catgry_end)
136
- { ast.lit(tb, encode_escapes(tb.text).to_sym) }
136
+ { ast.symbol(tb, encode_escapes(tb.text).to_sym) }
137
137
 
138
138
  ##
139
139
  # String interpolations / juxtapositions
140
140
 
141
- rule dyn_string_part:
141
+ rule string_compose_part:
142
142
  r(C.spc.* + expr_atom_not_string[:n0] + C.spc.* + lit_string[:n1])
143
143
  { [n0,n1] }
144
144
 
145
- rule dyn_string_parts:
146
- r(dyn_string_part.+[:nlist])
145
+ rule string_compose_parts:
146
+ r(string_compose_part.+[:nlist])
147
147
  { nlist.flatten }
148
148
 
149
- rule dyn_string:
150
- r(lit_string[:n0] + dyn_string_parts[:nrest])
151
- { ast.dstr(n0, [n0] + nrest) }
149
+ rule string_compose:
150
+ r(lit_string[:n0] + string_compose_parts[:nrest])
151
+ { ast.string_compose(n0, [n0] + nrest) }
152
152
 
153
- rule dyn_symstr:
154
- r(lit_symstr[:n0] + dyn_string_parts[:nrest])
155
- { ast.dsym(n0, [n0] + nrest) }
153
+ rule symbol_compose:
154
+ r(lit_symstr[:n0] + string_compose_parts[:nrest])
155
+ { ast.symbol_compose(n0, [n0] + nrest) }
156
156
 
157
157
  ##
158
158
  # Constants
@@ -173,14 +173,14 @@ rule sepd_constant:
173
173
 
174
174
  rule constant_list:
175
175
  r(constant[:n0] + sepd_constant.*[:nrest])
176
- { ast.arrass(n0, [n0, *nrest]) }
176
+ { ast.array(n0, [n0, *nrest]) }
177
177
 
178
178
  ##
179
179
  # Bare identifiers
180
180
 
181
181
  # Used in contexts where a bare identifier is a symbol
182
182
  rule id_as_symbol:
183
- r(T.identifier[:t0]) { ast.lit(t0, t0.sym) }
183
+ r(T.identifier[:t0]) { ast.symbol(t0, t0.sym) }
184
184
 
185
185
  ##
186
186
  # Object declarations
@@ -262,7 +262,7 @@ rule invoke_assignment:
262
262
  lhs.name = (""lhs.name"=").to_sym
263
263
  orig_arguments = lhs.arguments &? lhs.arguments.body ?? []
264
264
  arg_order = lhs.name==:"[]=" &? [*orig_arguments, rhs] ?? [rhs, *orig_arguments]
265
- lhs.arguments = ast.argass(rhs, arg_order)
265
+ lhs.arguments = ast.args(rhs, arg_order)
266
266
  lhs
267
267
  }
268
268
 
@@ -283,7 +283,7 @@ rule op_invoke: # Allow some binary operators to be invoked with a dot
283
283
 
284
284
  rule elem_invoke:
285
285
  r(lit_array[:na] + opt_block_body[:nb])
286
- { ast.invoke(na, null, :"[]", ast.argass(na, na.body), nb) }
286
+ { ast.invoke(na, null, :"[]", ast.args(na, na.body), nb) }
287
287
 
288
288
  rule op_invoke_id:
289
289
  left_op_normal
@@ -337,68 +337,61 @@ rule in_arg_list:
337
337
 
338
338
  rule arg_list:
339
339
  r(T.args_begin[:tb] + arg_sep_opt + in_arg_list.-[:nlist] + arg_sep_opt + T.args_end)
340
- { ast.argass(tb, (nlist || [])) }
340
+ { ast.args(tb, (nlist || [])) }
341
341
 
342
342
  rule lit_array:
343
343
  r(T.array_begin[:tb] + arg_sep_opt + in_arg_list.-[:nlist] + arg_sep_opt + T.array_end)
344
- { ast.arrass(tb, (nlist || [])) }
344
+ { ast.array(tb, (nlist || [])) }
345
345
 
346
346
  ##
347
347
  # Parameter lists
348
348
 
349
- rule param:
349
+ param_sep: (C.spc.* + T.arg_sep + C.spc.*).+ / (C.spc.* + !!T.params_end)
350
+ param_sep_opt: (C.spc / T.arg_sep).*
351
+ param_sepd: |x| r(x[:n0] + param_sep) { n0 }
352
+
353
+ rule req_param:
354
+ r(T.identifier[:ti] + !!param_sep)
355
+ { ast.reqprm(ti, ti.sym) }
356
+ rule opt_param:
350
357
  r(T.identifier[:ti] + C.spc_nl.* + T.assign[:to] + C.spc_nl.* + arg_expr[:nv])
351
- { [:optional, ast.lasgn(ti, ti.sym, nv)] }
352
- / r(T.identifier[:ti] + C.spc_nl.* + T.meme_mark[:to] + C.spc_nl.* + arg_expr.-[:nv])
353
- { [:kwargs, ast.lasgn(ti, ti.sym, nv || ast.lit(to, :"*"))] }
354
- / r(T.op_exp + C.spc_nl.* + T.identifier[:ti])
355
- { [:kwrest, ti.sym] }
356
- / r(T.op_mult + C.spc_nl.* + T.identifier[:ti])
357
- { [:rest, ti.sym] }
358
- / r(T.op_toproc + C.spc_nl.* + T.identifier[:ti])
359
- { [:block, ti.sym] }
360
- / r(T.identifier[:ti])
361
- { [:required, ti.sym] }
362
-
363
- rule param_sepd:
364
- r(arg_sep + param[:n0]) { n0 }
365
-
366
- rule param_sepds:
367
- r(param[:n0] + param_sepd.*[:nrest] + arg_sep_opt) { [n0, *nrest] }
358
+ { ast.optprm(ti, ti.sym, nv) }
359
+ rule rest_param:
360
+ r(T.op_mult + C.spc_nl.* + T.identifier[:ti])
361
+ { ast.restprm(ti, ti.sym) }
362
+ rule kwopt_param:
363
+ r(T.identifier[:ti] + C.spc_nl.* + T.meme_mark[:to] + C.spc_nl.* + arg_expr[:nv])
364
+ { ast.kwoptprm(ti, ti.sym, nv) }
365
+ rule kwreq_param:
366
+ r(T.identifier[:ti] + C.spc_nl.* + T.meme_mark[:to] + !!param_sep)
367
+ { ast.kwreqprm(ti, ti.sym) }
368
+ rule kwrest_param:
369
+ r(T.op_exp + C.spc_nl.* + T.identifier[:ti])
370
+ { ast.kwrestprm(ti, ti.sym) }
371
+ rule block_param:
372
+ r(T.op_toproc + C.spc_nl.* + T.identifier[:ti])
373
+ { ast.blkprm(ti, ti.sym) }
368
374
 
369
375
  rule param_list:
370
- r(T.params_begin[:tb] + T.params_end)
371
- { ast.args(tb, [], [], null, [], [], null, null) } # TODO: investigate removing
372
- / r(T.params_begin[:tb] + param_sepds[:plist] + T.params_end)
373
- {
374
- required = []
375
- optional = []
376
- rest = []
377
- post = []
378
- kwargs = []
379
- kwrest = []
380
- block = []
381
-
382
- loop { plist[0] && plist[0][0] == :required || break; required.push(plist.shift[1]) }
383
- loop { plist[0] && plist[0][0] == :optional || break; optional.push(plist.shift[1]) }
384
- loop { plist[0] && plist[0][0] == :rest || break; rest .push(plist.shift[1]) }
385
- loop { plist[0] && plist[0][0] == :required || break; post .push(plist.shift[1]) }
386
- loop { plist[0] && plist[0][0] == :kwargs || break; kwargs .push(plist.shift[1]) }
387
- loop { plist[0] && plist[0][0] == :kwrest || break; kwrest .push(plist.shift[1]) }
388
- loop { plist[0] && plist[0][0] == :block || break; block .push(plist.shift[1]) }
389
-
390
- required = required
391
- optional = optional
392
- rest = rest.first
393
- post = post
394
- kwargs = kwargs
395
- kwrest = kwrest.first
396
- block = block.first
397
-
398
- # TODO: move these conversions to their respective reductions
399
- block = block && ast.blkprm(tb, block)
376
+ r(T.params_begin[:tb]
377
+ + param_sep_opt
378
+ + param_sepd(req_param).*[:required]
379
+ + param_sepd(opt_param).*[:optional]
380
+ + param_sepd(rest_param).-[:rest]
381
+ + param_sepd(req_param).*[:post]
382
+ + param_sepd(kwreq_param / kwopt_param).*[:kw]
383
+ + param_sepd(kwrest_param).-[:kwrest]
384
+ + param_sepd(block_param).-[:block]
385
+ + T.params_end) {
386
+ kwrequired = kw.select |x| { x.node_type == :kwreqprm }
387
+ kwoptional = kw.select |x| { x.node_type == :kwoptprm }
400
388
 
401
- ast.args(tb, required, optional, rest, post, kwargs, kwrest, block)
389
+ # TODO: the ternary clauses should not be necessary
390
+ ast.params(tb
391
+ required, optional, (rest.is_a?(Array) &? rest.first ?? rest), post
392
+ kwrequired, kwoptional, (kwrest.is_a?(Array) &? kwrest.first ?? kwrest)
393
+ (block.is_a?(Array) &? block.first ?? block)
394
+ )
402
395
  }
403
396
 
404
397
  ##
@@ -594,7 +587,7 @@ rule sepd_decorator:
594
587
 
595
588
  rule decorators_and_meme_name:
596
589
  r(decorator[:n0] + sepd_decorator.*[:nrest])
597
- { ast.arrass(n0, [n0, *nrest].reverse) }
590
+ { ast.array(n0, [n0, *nrest].reverse) }
598
591
 
599
592
  rule meme:
600
593
  r(decorators_and_meme_name[:nd]