monte-language / typhon

A virtual machine for Monte.
Other
67 stars 10 forks source link

capn.mt fails on Person example schema #182

Closed dckc closed 6 years ago

dckc commented 7 years ago

When I compile the schema from https://capnproto.org/cxx.html into meta.capn and run monte eval mast/lib/capnp.mt I get:

~ Problem: m`${expr-hole 0}`'s type ("ValueHoleExpr") is not one of ["NounExpr", "TempNounExpr"]

The problem seems to be thrown from line 557 of capn.mt

def expr := m`def $lhs := $rhs`

monte version: 17hymcpjpavxcwsy8x7hkd1zrxrilnph-monte/bin/monte

full trace:

18:27 dconnolly@bid-bse02$ monte eval mast/lib/capnp.mt 
Taking initial turn in script...
TRACE: From vat pa
 ~ "Loader args: [\"run\", \"montec\", \"-mix\", \"mast/lib/capnp.mt\", \"mast/lib/capnp.mast\"]"
TRACE: From vat pa
 ~ "Loading montec"
TRACE: From vat pa
 ~ "<readInputFile> took 0.202000 seconds"
  77         to _makeIterator():
  78             var position :Int := 0
  79             return object listIterator:
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~
  80                 to next(ej):
  81                     if (position >= size):
  82                         throw.eject(ej, "End of iteration")
Object listIterator has only one method
 354                 to _makeIterator():
 355                     var position :Int := 0
 356                     return object interpretedListIterator:
                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 357                         to next(ej):
 358                             if (position >= pointer.size()):
 359                                 throw.eject(ej, "End of iteration")
Object interpretedListIterator has only one method
TRACE: From vat pa
 ~ "<parse> took 1.003000 seconds"
TRACE: From vat pa
 ~ "<expandTree> took 0.000000 seconds"
TRACE: From vat pa
 ~ "<optimize> took 0.000000 seconds"
TRACE: From vat pa
 ~ "<serialize> took 0.000000 seconds"
TRACE: From vat pa
 ~ "<writeOutputFile> took 4.675000 seconds"
TRACE: From vat pa
 ~ "All done!"
Total recorded time: 6.203854
Recorded times:
~ Deserialization: 0.029625 (0.477521%)
~ Time spent in prelude: 0.042536 (0.685635%)
~ Main nanopass pipeline: 0.086189 (1.389274%)
~ Audition (DF): 0.057291 (0.923467%)
~ Time spent in vats: 5.985960 (96.487766%)
~ Time spent in I/O: 0.001492 (0.024054%)
Recorded rates:
~ Ejector usage: 39.806769%
~ DischargeAuditors clear: 32.702703%
Taking initial turn in script...
TRACE: From vat pa
 ~ "Loader args: [\"run\", \"mast/lib/capnp\", \"eval\", \"mast/lib/capnp.mt\"]"
TRACE: From vat pa
 ~ "Loading mast/lib/capnp"
TRACE: From vat pa
 ~ "Read in 2640 bytes"
TRACE: From vat pa
 ~ "processing requested files"
TRACE: From vat pa
 ~ "Processing file [\"id\" => 15392627097679651212, \"filename\" => \"person-example.capnp\", \"imports\" => []]"
TRACE: From vat pa
 ~ "processing nodes"
TRACE: From vat pa
 ~ "node 9264404037739032961, name person-example.capnp:Person.PhoneNumber.Type"
TRACE: From vat pa
 ~ "node is enum [\"enumerants\" => [[\"codeOrder\" => 0, \"name\" => \"mobile\", \"annotations\" => []], [\"codeOrder\" => 1, \"name\" => \"home\", \"annotations\" => []], [\"codeOrder\" => 2, \"name\" => \"work\", \"annotations\" => []]]]"
TRACE: From vat pa
 ~ "node 15392627097679651212, name person-example.capnp"
TRACE: From vat pa
 ~ "node is file"
TRACE: From vat pa
 ~ "node 15542091980029599831, name person-example.capnp:Person"
TRACE: From vat pa
 ~ "node is struct"
TRACE: From vat pa
 ~ "struct signature 1 4"
TRACE: From vat pa
 ~ "Looking at field id"
TRACE: From vat pa
 ~ "Looking at field name"
TRACE: From vat pa
 ~ "Looking at field email"
TRACE: From vat pa
 ~ "Looking at field phones"
TRACE: From vat pa
 ~ "Looking at field employment"
TRACE: From vat pa
 ~ "node 18074171624696554533, name person-example.capnp:Person.employment"
TRACE: From vat pa
 ~ "node is struct"
TRACE: From vat pa
 ~ "struct signature 1 4"
TRACE: From vat pa
 ~ "Looking at field unemployed"
TRACE: From vat pa
 ~ "Looking at field employer"
TRACE: From vat pa
 ~ "Looking at field school"
TRACE: From vat pa
 ~ "Looking at field selfEmployed"
TRACE: From vat pa
 ~ "node 17212601800786091575, name person-example.capnp:AddressBook"
TRACE: From vat pa
 ~ "node is struct"
TRACE: From vat pa
 ~ "struct signature 0 1"
TRACE: From vat pa
 ~ "Looking at field people"
TRACE: From vat pa
 ~ "node 12222076608590275324, name person-example.capnp:Person.PhoneNumber"
TRACE: From vat pa
 ~ "node is struct"
TRACE: From vat pa
 ~ "struct signature 1 1"
TRACE: From vat pa
 ~ "Looking at field number"
TRACE: From vat pa
 ~ "Looking at field type"
TRACE: From vat pa
 ~ Problem: m`${expr-hole 0}`'s type ("ValueHoleExpr") is not one of ["NounExpr", "TempNounExpr"]
 ~   throw.eject(null, "m`${expr-hole 0}`'s type (\"ValueHoleE…)
 ~ File 'typhon/objects/ejectors.py', in object Throw:
 ~   <nodeGuard>.coerce(${expr-hole 0}, null)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/prelude/monte_ast.mast', in object _$Ast$nodeGuard:
 ~   <_>.run(["noun", 0], [<nodeGuard>, ${expr-hole 0}], <ejector (inert)>)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/prelude/monte_ast.mast', in object _$makeNodeAuthor$nodeMaker$_:
 ~   <loop>.run(<_iterForever>, <_>)
 ~ File 'anonymous', in object typhon$object:
 ~   <_accumulateList>.run(<zipped>, <_>)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/prelude.mast', in object _accumulateList:
 ~   <_accumulateMap>.run(<zipped>, <_>)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/prelude.mast', in object _accumulateMap:
 ~   makeFinalPattern.run(${expr-hole 0}, null, <m``#:blob::1:0:1:6>)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/prelude/monte_ast.mast', in object _$makeNodeAuthor$nodeMaker:
 ~   M.call(makeFinalPattern, "run", [${expr-hole 0}, null, <m``#:blob::1:0:…, ["FAIL" => throw])
 ~ File 'typhon/scopes/safe.py', in object MObject:
 ~   <_astBuilder>.FinalPattern(${expr-hole 0}, null, <m``#:blob::1:0:1:6>)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/prelude/monte_ast.mast', in object _$makeAstBuilder$_astBuilder:
 ~   <astBuilder>.FinalPattern(${expr-hole 0}, null, <m``#:blob::1:0:1:6>)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/prelude/monte_ast.mast', in object _$makeCoreAst$astBuilder:
 ~   <basic>.run(true, <ejector (inert)>, <ejector (inert)>)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/lib/monte/monte_parser.mast', in object _$parseMonte$basic:
 ~   <blockExpr>.run(<ejector (inert)>)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/lib/monte/monte_parser.mast', in object _$parseMonte$blockExpr:
 ~   <blockExpr>.run(<ejector (inert)>)
 ~ File 'typhon/objects/refs.py', in object Promise:
 ~   <seq>.run(true, <ejector (inert)>)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/lib/monte/monte_parser.mast', in object _$parseMonte$seq:
 ~   <parseMonte>.run(<monteLexer>, <astBuilder>, "expression", throw, throw)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/lib/monte/monte_parser.mast', in object _$parseMonte:
 ~   <parseExpression>.run(<monteLexer>, <astBuilder>, throw, throw)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/lib/monte/monte_parser.mast', in object _$parseExpression:
 ~   <m``>.valueMaker(["def ", <VALUE_HOLE>, " := ", <VALUE_H…)
 ~ File '/nix/store/rxwsn0sa5s3h9zczyf5z9wwj6vv26gmy-typhon/mast/prelude/m.mast', in object _$m``:
 ~   <compiler>.run()
 ~ File '<eval>', in object _$makeCompiler$compiler:
 ~   <_>.run(b`$\x00$\x00$\x00$\x00I$\x01$\x00$\x00$…)
 ~ File '<eval>', in object _$main$_:
Total recorded time: 0.269617
Recorded times:
~ Deserialization: 0.023352 (8.661227%)
~ Time spent in prelude: 0.041845 (15.520278%)
~ Main nanopass pipeline: 0.049647 (18.414016%)
~ Audition (DF): 0.033008 (12.242673%)
~ Time spent in vats: 0.121040 (44.893337%)
~ Time spent in I/O: 0.000341 (0.126453%)
Recorded rates:
~ Ejector usage: 26.452822%
~ DischargeAuditors clear: 32.191781%
dckc commented 7 years ago

I guess I should make this a separate bug, but I can reproduce it with this little script, which does not win but loses as above:

exports (main)

def main(_argv) as DeepFrozen:
    def builder := ::"m``".getAstBuilder()
    def n := "x"
    def lhs := builder.FinalPattern(builder.NounExpr(n, null), null, null)
    def rhs := builder.LiteralExpr(2, null)
    def expr := m`def $lhs := $rhs`
    traceln(`win! $expr`)
dckc commented 7 years ago

Using builder.DefExpr(lhs, null, rhs, null) wins:

exports (main)

def main(_argv) as DeepFrozen:
    def builder := ::"m``".getAstBuilder()
    def n := "x"
    def lhs := builder.FinalPattern(builder.NounExpr(n, null), null, null)
    def rhs := builder.LiteralExpr(2, null)
    # BUGGY:  def expr := m`def $lhs := $rhs`
    def expr := builder.DefExpr(lhs, null, rhs, null)
    traceln(`win! $expr`)
MostAwesomeDude commented 6 years ago

The QP bug was fixed sometime in the past few months. The Capn work continues in #162.

dckc commented 6 years ago

I also confirmed that as of 2c39756 we can actually compile the Person example schema:

$ capnp compile -o $(which cat) myproto.capnp >myproto.capn
$ ~/.nix-profile/mt-typhon -l mast -l . loader run tools/capnpc <myproto.capn >myproto.mast
$ monte dump-mast myproto.mast >myproto.mt

myproto.capnp.txt myproto.mt.txt

dckc commented 6 years ago

the translation of employment :union { ... } looks goofy and PhoneNumber.type

I wonder if I should re-open this.