Re: Some compiler issues and a request for debugging/design help
"Paul R. Potts" <[email protected]> Tue, 18 Jun 2013 13:30:15 -0400
| Newsgroups | gmane.comp.lang.dylan.gwydion.devel |
|---|---|
| Message-ID | <[email protected]> |
Thanks, Bruce. I am not quite sure I like the sound of "infecting my vim with a cloned pathogen" (kinda X-Files!) but I am trying it : ) Paul On Jun 16, 2013, at 11:43 AM, Bruce Mitchener <[email protected]> wrote: > Wow, this is awesome. > > I'm going to need some time to look into the things that you're reporting, > but it sounds like you've identified some shortcomings and / or compiler > bugs. :) > > For one quick answer, I've used vim with pathogen on OS X. What I did then > was: > > * Put pathogen.vim into ~/.vim/autoload/ > * mkdir ~/.vim/bundle > * cd ~/.vim/bundle/ > * Cloned git://github.com/dylan-lang/dylan-vim.git > * Add ":call pathogen#infect()" as the first line in my ~/.vimrc > * Also added :syntax on and some other stuff to the ~/.vimrc > > That'll also make it easy for you to get our updates as bugs get fixed in > the vim integration. > > - Bruce > > > > On Sun, Jun 16, 2013 at 9:11 PM, Paul R. Potts <[email protected]>wrote: > >> Hello Dylanistas, happy Father's Day! >> >> Being unemployed now I'm doing some coding for my own learning/fun >> recently… blogging about it here: >> >> http://praisecurseandrecurse.blogspot.com/2013/06/objective-c-day-5.html >> >> Struggling with object-oriented designs, I have in the past found it very >> useful to implement my ideas in Dylan to get my design thinking >> straightened, and then port it to a different implementation language, >> working around missing features. So I've been doing that with my little >> implementation of the old Mac "Polar" game -- porting it from Objective-C >> to Dylan as I think about what an ideal, textbook-concise implementation >> would look like. >> >> If you aren't familiar with Polar, the idea is that your avatar is a >> penguin, walking around on a 4x24 grid of ice. The squares that make up the >> world can be empty, ice blocks, mountains, trees, hearts, bombs, and >> houses. They have rules to interact like so: >> >> - The penguin can walk on ice and through trees (forested tiles) >> - ice blocks, hearts, and bombs, if pushed by the penguin onto empty >> squares, will slide, and continue sliding until they collide with a >> non-empty square >> - if an ice block is pushed against some other non-empty square it is >> crushed and disappears >> - if a bomb hits a mountain, it blows up the mountain and both bomb and >> mountain disappear >> - if a heart hits a house, it disappears, and that gets you closer to your >> goal of winning the board; when all the hearts have been cleared from the >> board, the stage is done >> >> I've implemented this in Dylan using classes -- empty classes with no >> slots, just so that I can dispatch on their types, as in a collide method >> that takes singleton heart and house will do one thing, a collide method >> that takes singleton mountain and bomb will do something else. I'll attach >> my source in case you would like to look at it/play with it. Notes on that >> below. >> >> I've been playing with the 2012.1 compiler and have come across a few >> things. Maybe these are all well known, maybe they are actually not bugs >> and I just misunderstand, or maybe there are workarounds. I would be happy >> to take a crack at fixing some if I can, although it seems that maybe >> people far smarter than me have tried and failed -- what is the state of >> the art as it were in getting the compiler or run-time up under some kind >> of debugging environment? The way runtime errors just terminate, without >> giving line numbers, I find less than helpful. >> >> It looks like there are still a lot of issues with making collection >> types. For example, I want to make a type-union of singletons and use it as >> the basis of a collection, where my constants like $the-bomb are instances >> of simple classes defined at the module level: >> >> define constant <tile-or-false> = type-union( >> singleton( $the-bomb ), singleton( $the-empty ), >> singleton( $the-heart ), singleton( $the-house ), >> singleton( $the-ice-block ), singleton( $the-mountain ), >> singleton( $the-tree ) ); >> >> If I instantiate an array at the top level: >> >> define constant <board-type> = limited( <vector>, of: <tile-or-false>, >> init-value: $the-empty, size: 96 ); >> >> The compiler accepts this fine but at run-time I get a crash like so: >> >> #f is not of type {<union>: {<union>: {<union>: {<union>: {<union>: >> {<union>: {<bomb>}, {<empty>}}, {<heart>}}, {<house>}}, {<ice-block>}}, >> {<mountain>}}, {<tree>}} >> #f is not of type {<union> 0x476ed0} >> Breaking into debugger. >> Trace/BPT trap: 5 >> >> It seems that including the singleton( #f ) is absolutely necessary to >> even create the limited type. I'm guessing that internally it is >> constructed containing #f before the init-value is actually applied, but it >> seems to me that this is a leaking implementation details? >> >> Next, it looks like some work has been done on collections recently but >> some of them still seem pretty broken. If I define a limited 2-D array like >> so: >> >> define constant <board-type-2D> = limited( <array>, of: <tile-or-false>, >> init-value: $the-empty, dimensions: #( 4, 24 ) ); >> >> If I instantiate one, it always comes out as a simple object vector with >> actual size zero, and trying to set any element crashes. >> >> ELEMENT outside of range: 0 >> ELEMENT outside of range: 0 >> Breaking into debugger. >> Trace/BPT trap: 5 >> >> Also, it appears that if I have a constant like >> >> define constant $board-dim-y = 4; >> >> I can't use it as something to pass in the dimensions: parameter. >> >> So I'm still having to fake a 2-D array with my own indexing calculations >> (which works OK). >> >> Let's say I then have my fake 2-D array type: >> >> define constant <board-type> = limited( <vector>, of: <tile-or-false>, >> init-value: $the-empty, size: 96 ); >> >> I want to use that type as a slot type: >> >> define class <model> (<object>) >> slot board :: <board-type>; >> slot penguin-pos :: <pos>; >> slot penguin-dir :: <dir>; >> slot heart-count :: <integer>; >> end; >> >> that also fails in a not-very-helpful manner. (I think that's a failure on >> my part -- <board-type> is actually not an instantiable class type, so my >> bad). I've wound up using plain old <array> for slot board and that seems >> to work. >> >> Let's see, various other less-than-helpful crashes… oh, if I accidentally >> use a constant instance of a class instead of a type in a method definition >> like so: >> >> define method collide( model :: <model>, dir :: <dir>, >> slider-pos :: <pos>, slider-tile :: <pushable-tile>, >> next-pos :: <pos>, next-tile :: $the-empty ) >> end; >> >> That produces a crash at program start-up even if I never call that >> method… ugh (it should read "next-tile == $the-empty -- my bad again, but >> ugh). >> >> Let's see, what else… oh, if I have a crash I get _no_ output from >> format-out, even if I have printed hundreds of lines before the crash; I >> was not easily able to locate any kind of equivalent of flush()? >> >> So I've made some progress but I still have a crashing bug -- line 252. If >> I un-comment that line, I get a crash in setTileAtXYDebug() in what looks >> to me like the kind of array element setter call that the program makes >> hundreds of times. In this case it is driven specifically by the collide >> method at line 153, the collision between bombs and mountains. In fact it >> really should just call setTileAtPos, but I was so confused by why this >> particular set of calls were always crashing that I made a separate method >> just to try to figure out what was different here. >> >> Maybe my somewhat muddled design will become clear. The goal was to try, >> basically, to use the dispatch mechanism entirely for the penguin push and >> collide methods. I've had some difficulty here. I was getting errors about >> dispatch being determined by "arbitrary and capricious --?" rules. I think >> the current compiler is up to this if I can avoid colliding with certain >> mis-features. >> >> Basically, the bigger design issue is that I want to use classes to >> represent the tile behaviors, and so I can dispatch on singletons -- I >> don't care about instances as the tiles have no state. But given that >> interactions take place on a board and can cross the entire board, class >> methods have to be able to access the board and look up and alter arbitrary >> tiles. So I'm kind of torn. I've played with giving tiles their own >> coordinates, with using actual instances for tiles and replacing them as >> they changed, but that also seems silly. I'd be curious as to whether any >> of you see a cleaner, simpler design in here struggling to get out. Note >> also how I'm passing both positions and types to the collide and push >> methods. That seems really sub-optimal but I wasn't sure if I could ask the >> compiler to dispatch on wrapped-up objects that contained both positions >> and singleton instances… but maybe that would be cleaner? >> >> Thanks for any conversation… it's keeping my mind off the realities of my >> job search while I wait to here results back from various >> interviews/applications. >> >> Paul >> >> p.s. the color syntax highlighting in vim on Ubuntu for .dylan files is >> very nice -- anyone figured out how to get that working on MacOS X? >> >> >> >> >> >> _______________________________________________ >> hackers mailing list >> [email protected] >> https://lists.opendylan.org/mailman/listinfo/hackers >> >> > _______________________________________________ > hackers mailing list > [email protected] > https://lists.opendylan.org/mailman/listinfo/hackers _______________________________________________ hackers mailing list [email protected] https://lists.opendylan.org/mailman/listinfo/hackers