Re: Some compiler issues and a request for debugging/design help
Bruce Mitchener <[email protected]> Sun, 16 Jun 2013 22:43:35 +0700
| Newsgroups | gmane.comp.lang.dylan.gwydion.devel |
|---|---|
| Message-ID | <CA+esKjMyqAEnmnjukDkQg0g4Ysf=Y_Y=Y+FgeSwS94ghRNMdKQ@mail.gmail.com> |
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