< 1189988741 0 :RedDak!unknown@unknown.invalid QUIT :Remote closed the connection < 1189988807 0 :poiuy_qwert!n=poiuyqwe@bas2-toronto47-1242398577.dsl.bell.ca JOIN :#esoteric < 1189991690 0 :ehird`!unknown@unknown.invalid QUIT : < 1189994509 0 :edwardk!n=edwardk@pdpc/supporter/base/edwardk JOIN :#esoteric < 1189994879 0 :calamari!n=calamari@ip72-200-73-175.tc.ph.cox.net JOIN :#esoteric < 1189996339 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :anyone awake who is versed in haskell syntax? playing with a toy language with similar syntax at the moment < 1189996352 0 :pikhq!unknown@unknown.invalid PRIVMSG #esoteric :oerjan? Oh oerjan? < 1189996354 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :*ahem* < 1189996359 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :but with no types < 1189996361 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :heya oerjan < 1189996403 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :basically i figured out a way to code up monads without types, so i've been playing with a framework somewhat between haskell and erlang for the last few days < 1189996446 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :ever used erlang? < 1189996477 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :nope < 1189996481 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :the idea in erlang is that you have atoms lists and tuples, and a few primitive types, but nothing else really and no type system. < 1189996530 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :what i went back and did was revisit the notion of a constructor in a typeless setting, so now i just say that a given constructor has some 'arity' associated with it. i.e. cons has arity 2 and nil has arity 0, but avoid specifying the types of the terms that go in each slot. < 1189996561 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :ok. similar to prolog i guess. < 1189996576 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so in erlang you'd have to say {cons, x, xs} or {nil} whereas in this setting you can say arity 2 Cons, then Cons x xs and the default arity is 0 < 1189996589 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :sorta, except it can be written applicatively because of the basic lazy semantics < 1189996590 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :(i vaguely recall erlang being descended somewhat from prolog, btw) < 1189996613 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so you get haskell style pointfree syntax < 1189996647 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :yeah < 1189996651 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so the dilemma comes about with monads, right since traditionally you think of a monad as doing different things based on the type it is inhabiting < 1189996695 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :pretty essential if you want more than one with the same syntax < 1189996695 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so if you don't have types, haskell style monads seem like they are right out without passing around some sort of additional parameter that indicates the 'type of monad you are in' and using that. i.e. the haskell dictionary passing style < 1189996706 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :well, turns out you don't need that after all =) < 1189996726 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :the trick is the monad laws < 1189996739 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :i have thought similar thoughts < 1189996756 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so for a concrete example lets define the identity monad < 1189996757 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :return = Ok < 1189996761 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :Ok x >>= f = f x < 1189996779 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :now Ok is a constructor which can be used as a tag when pattern matching on >>= so it knows what case its in. < 1189996785 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :mzero = Nil < 1189996790 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :Nil >>= f = f x < 1189996791 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :er < 1189996795 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :Nil >>= f = Nil < 1189996807 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :ok, so now we have the Identity Monad, and a Maybe monad < 1189996829 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :but what we need to do is anticipate that anywhere we could use the resulting monad we could also get 'Ok' < 1189996841 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :runReader (Reader f) = f < 1189996846 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :runReader (Ok x) = const x < 1189996879 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so, then we consider something like 'ask' which seems to behave differently depending on context. < 1189996883 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :ask = Reader id < 1189996884 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :yep, you need a return that can be used everywhere. same solution as i thought of. < 1189996909 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so the trick there is to autolift that into the reader transformer < 1189996909 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :there is some limitation though. < 1189996937 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :there are, in that you always have to tag it with a constructor < 1189996938 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :you can only use this for monads where >>= is strict in the first argument. < 1189996943 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :there is no 'true identity monad' < 1189996947 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :that is also true < 1189996955 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :Reader is not really < 1189996959 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :at least strict insofar as the outermost tag < 1189997008 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :otoh if you use something like runReader, maybe you can avoid that. < 1189997015 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :yeah < 1189997018 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so the other fix < 1189997041 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :was to do something like the solution i want to play with for how to handle the monomorphism restriction and numerical classes < 1189997051 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :which reverts to carrying around the type parameter < 1189997081 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :if we define : to be an infix function, and + to be an arity 2 constructor you can say things like < 1189997099 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :a + b : Int = mp_add (a : Int) (b : Int) < 1189997121 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :haskell uses :: < 1189997122 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :and so on and so forth as a way to define how to recursively evaluate an expression as an integer < 1189997139 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :yeah the : in that case is an actual operator in my toy language. and i never liked haskell's :: =) < 1189997149 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :ML uses : < 1189997151 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :yeah < 1189997156 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :and the opposite for lists < 1189997169 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :i'm : for 'types' in this case and ; for lists < 1189997205 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so with that same machinery you can make 'Return' and >>= both into constructors and define a similar decomposition < 1189997230 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :Return x : List = (x; Nil) < 1189997269 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :m >>= k : List = concat (map k m) < 1189997303 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :then the same expression consisting of Returns and >>='s can be reused in different monads until you apply a : to 'type' it < 1189997326 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :there are some tricks that still entails because : T should be idempotent, etc. < 1189997338 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :didn't you play around with a language with lots of types and (partially undecidable) inference a while ago? < 1189997343 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :and basically all : T is doing it taking the place of runT < 1189997374 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :yeah this is the same language i just stripped out the types for a while, since the non-type aspects (the substructural annotations and the theorem proving parts) are the parts I care about < 1189997395 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so i wanted to see how far i could go with no types in the traditional sense, just detected pattern match failure < 1189997396 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :oh < 1189997408 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :basically its if i use ndm's CATCH tool as my type system ;) < 1189997425 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :or ESC/Haskell without the /Haskell =) < 1189997459 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :i figured it was a much stronger result to be able to duplicate existing techniques with the machinery than to just layer another abstraction on top < 1189997477 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :ic < 1189997517 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :otherwise the language remains unchanged, optimistic evaluation with lazy semantics, still has the theorem proving bits, but none of those pesky types < 1189997537 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :having the monads above lets me stay lazy and not go crazy < 1189997572 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :constructor elimination becomes of course a critical optimization step because EVERYTHING is tagged and constructors are global < 1189997591 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so my apply/dispatch mechanism is uglier < 1189997624 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :and as a result of the above reasoning its necessary for me to allow extension of the same function (say >>=) in many locations in the code < 1189997637 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so its hard to do separate compilation < 1189997641 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :but its a fun mental puzzle < 1189997646 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :"We're all mad here. I'm mad, you're mad." "How do you know i'm mad?" Said Alice. "You must be." Said the Cat, "or you wouldn't have come here." < 1189997666 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :(regarding going crazy ;) ) < 1189997691 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :=) < 1189997771 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :http://comonad.com/r5.opt < 1189997779 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :is sort of a spew of random gibberings in this setting < 1189997843 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :arity declarations are kind of like haskell fixity declarations, but for right now fixities are er. fixed coz i'm lazy and haven't added them =) < 1189997867 0 :calamari!unknown@unknown.invalid QUIT :"Leaving" < 1189997869 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :\x. foo ~= \x -> foo since there is no legal use for a . inside a pattern there < 1189997878 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :and its closer to the lambda calculus formalism < 1189997938 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :i like the fact that it sort of naturally subtypes back and forth between the monads (Nil and Nothing collapse, etc) < 1189997952 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :the Identity monad is just a Maybe monad where Nil is never used, etc. < 1189997976 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :i had an earlier version with "types" for the monads before i realized i could live without the type tags < 1189998040 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :http://comonad.com/r3.opt < 1189998105 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :basically anything without a = in the line is taken to be an 'axiom' which is just a function that any time the pattern matches returns true, and if none of the patterns match anywhere it returns false < 1189998123 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :and i do prolog/erlang style structural equality tests if you use the same term in a pattern twice < 1189998126 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :x <: x < 1189998129 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :for instance < 1189998225 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :hm... you get sort of a supermonad that includes all the others... < 1189998231 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :but plumbing around the monad type everywhere got ugly, i did a version with a sort of implicit type-level reader monad and another draft using dynamic binding and delimited control to change a dynamically scoped 'current monad' variable with pattern matching support on dynamic variables < 1189998233 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :yeah < 1189998256 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :brings to mind that somewhat horrid 'unimo' paper iirc < 1189998292 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :but basically i find it amusing that it lets me express a subtyping relationship among the different monads thats more or less impossible to express in a hindley milner style formalism < 1189998362 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :i started down this slippery slope with http://comonad.com/reader/2007/parameterized-monads-in-haskell/ < 1189998395 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :one thing i like about it is the reductions are confluent even if you are locally working in a different 'sub-monad' < 1189998429 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :i.e. if you work with just returns and >>= you stay in 'identity' until you mix in an 'ask' then you get lifted out into Reader, then maybe you 'get' so you get placed in a state monad, etc. < 1189998443 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :then when you runFoo you peel off the layers of the onion < 1189998451 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :and you coerce the types to fit < 1189998482 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so locally you can avoid having to pay the overhead of the full monad you are in < 1189998559 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :which when you add in constructor-elimination should open up a lot of optimization opportunities that you never get exposed to in haskell because you can't see them through the monad-noise < 1189998609 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :the pain in the ass comes from the fact that i have to try to use control flow analysis to see if you ever do the wrong thing ;) < 1189998699 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :still playing with it < 1189998708 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :but i thought it was a neat way to tackle the 'untyped monad' < 1189998729 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :as opposed to the dictionary passing style mechanism that dpiponi used in his toy untyped monadic language < 1189998760 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :coz passing dictionaries everywhere explicitly gets rid of the nice syntactic benefits of having monads < 1189999297 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :i guess a mathematician if necessary would put the monad as index on the >>= < 1189999346 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :i played with carrying around an explicit type using the : as a reduction operator, which lets you do things like the anonymous reader monad as well < 1189999356 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :not sure if thats a win though < 1189999380 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :the : reduction technique is how i'm thinking about handling the monomorphism restriction though < 1189999385 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :its a funny way to view the world though < 1189999389 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :+ as a constructor < 1189999406 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :then applying an evaluation function (:) to the constructed value the evaluate it < 1189999476 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :your mixing of monads might be a bit awkward if the transformers don't commute < 1189999488 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :yeah a known issue =/ < 1189999519 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :you may have to inject a runFoo or a : t to disambiguate < 1189999626 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :x : READER = Reader (runReader x) < 1189999653 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so that its idempotent < 1189999684 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :then i can stick to my 'typeless monad' approach and use (:) as a disambiguation operator letting it retain its 'type-annotation' like connotation < 1190001082 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :f(15) = 16; f(34) = 92; f(13) = 8; f(20) = ??? < 1190001150 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :huh? < 1190001177 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :is this all the information about f you've got? < 1190001256 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :13 is a prime, and 8 is the previous fibonacci number < 1190001267 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :that's all the information i have < 1190001281 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :ah one sec < 1190001288 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :just looked at my screen i think i know it < 1190001296 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :oh, edwardk < 1190001314 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :you were the one with the language that no one but oerjan understood, right? < 1190001351 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :> let f x = x*4 - 44 in map f [15,34,13,20] ===> (10:55:49 PM) Lambda Bot: [16,92,8,36] < 1190001361 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :yeah < 1190001398 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :its changed into a simpler language with basically the same issue ;) < 1190001418 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric ::D < 1190001452 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :bsmntbombdood: anyways that should answer your question < 1190001483 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :the key insight for me was the f(15) and f(13), i backed that out to guess f(11) and used f(34) to test its linearity < 1190001511 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :aaah < 1190001635 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :exercise: now, if it hadn't been linear, why wouldn't it be a good idea to try a second degree polynomial? ;) < 1190001651 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :heh < 1190001671 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :coz you could always find one? =) < 1190001681 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :edwardk wins the prize! < 1190001692 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :i knew that math degree was good for something ;) < 1190001731 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :actually thats a perfectly good use for a second degree polynomial for these silly underspecified problems =P < 1190001793 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :probably < 1190001795 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :what about f(361) = 22; f(121) = 14; f(81) = 12; f(25) = ?? < 1190001811 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :ACTION watches as #esoteric does bsmntbombdood's homework =) < 1190001822 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :not my homework! < 1190001830 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :(my dads) :P < 1190001842 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :look at f(121) and f(81), do the same trick i did above < 1190001845 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :in this case we are looking at squares < 1190001855 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :oerjan: ? < 1190001885 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :all the arguments are squares < 1190001886 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :'every 20 it changes by 1', so find 0 < 1190001907 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :rise over run < 1190001910 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :sqrt(n)+3 < 1190001921 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :in fact < 1190001957 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :i'll buy that < 1190002005 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :wow < 1190002006 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :thanks < 1190002240 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :oerjan is right in that case since that one fails the naive linearity test: > let f x = x/20 + 7.95 in map f [81,121,361,25] ==> Lambda Bot: [12.0,14.0,> 26.0 < ,9.2] < 1190002268 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :and it looks ugly when you try it linearly ;) < 1190002385 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :so do you think people would like to play with a (sort-of) untyped lazy language with just constructors and easily extensible cases? it opens up a haskell-like language to the erlang-like use cases of long-uptime systems, etc. < 1190002402 0 :edwardk!unknown@unknown.invalid PRIVMSG #esoteric :since its easy to code-swap in that sort of system < 1190003077 0 :Sgeo!n=Sgeo@ool-18bf68ca.dyn.optonline.net JOIN :#esoteric < 1190003776 0 :edwardk!unknown@unknown.invalid PART #esoteric :? < 1190004725 0 :poiuy_qwert!unknown@unknown.invalid QUIT : < 1190006422 0 :GreaseMonkey!n=saru@222-154-162-212.jetstream.xtra.co.nz JOIN :#esoteric < 1190009918 0 :Sgeo!unknown@unknown.invalid QUIT :"Ex-Chat" < 1190010030 0 :Guilt!n=ca361a78@cpe-74-76-59-19.nycap.res.rr.com JOIN :#esoteric < 1190010041 0 :pikhq!unknown@unknown.invalid PRIVMSG #esoteric :Just a tiny game I've been designing in PEBBLE. . . < 1190010054 0 :pikhq!unknown@unknown.invalid PRIVMSG #esoteric :(PEBBLE being a macro language I devised which compiles to Brainfuck) < 1190010076 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :oh? :) < 1190010078 0 :pikhq!unknown@unknown.invalid PRIVMSG #esoteric :http://pikhq.nonlogic.org/pebble.php If you need to ask me questions, do so later; I'm going to bed, since it's late. < 1190010087 0 :pikhq!unknown@unknown.invalid PRIVMSG #esoteric :Sorry. < 1190010092 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :okay :) nighty night < 1190010095 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :getting up early-- < 1190010096 0 :pikhq!unknown@unknown.invalid PRIVMSG #esoteric :Enjoy Brainfucking with everyone else. . . < 1190010100 0 :pikhq!unknown@unknown.invalid PRIVMSG #esoteric :If they're here. < 1190010114 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :i will! :) < 1190011856 0 :g4lt-sb100!n=galt@pdpc/supporter/basic/g4lt JOIN :#esoteric < 1190012061 0 :sp3tt!unknown@unknown.invalid QUIT :Read error: 104 (Connection reset by peer) < 1190012408 0 :Guilt!unknown@unknown.invalid QUIT :"CGI:IRC at http://freenode.bafsoft.ath.cx:14464/ (EOF)" < 1190012752 0 :g4lt-mordant!unknown@unknown.invalid QUIT :Read error: 113 (No route to host) < 1190013645 0 :tokigun_!unknown@unknown.invalid QUIT :Read error: 104 (Connection reset by peer) < 1190013750 0 :tokigun!n=tokigun@haje8.kaist.ac.kr JOIN :#esoteric < 1190014729 0 :GreaseMonkey!unknown@unknown.invalid QUIT :"gtg bye" < 1190015160 0 :oerjan!unknown@unknown.invalid QUIT :"leaving" < 1190015192 0 :puzzlet_!n=puzzlet@147.46.241.168 JOIN :#esoteric < 1190015202 0 :Guilt!n=ca361a78@cpe-74-76-59-19.nycap.res.rr.com JOIN :#esoteric < 1190015452 0 :puzzlet_!unknown@unknown.invalid QUIT :Read error: 104 (Connection reset by peer) < 1190015479 0 :puzzlet_!n=puzzlet@147.46.241.168 JOIN :#esoteric < 1190015492 0 :puzzlet__!n=puzzlet@147.46.241.168 JOIN :#esoteric < 1190015504 0 :puzzlet__!unknown@unknown.invalid QUIT :Client Quit < 1190015999 0 :clog!unknown@unknown.invalid QUIT :ended < 1190016000 0 :clog!unknown@unknown.invalid JOIN :#esoteric < 1190016397 0 :puzzlet!unknown@unknown.invalid QUIT :Read error: 110 (Connection timed out) < 1190016775 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :i was wondering. would the equivalent of code-compression in brainfuck involve functions? :) < 1190016792 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :brainfuck code is kinda' huge < 1190017001 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :brainfuck code looks easy to compress, you know. < 1190017021 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :with lz, you could put those identified patterns together < 1190017447 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :yes, it's easy to compress. < 1190017463 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :try bzip2 :) < 1190017542 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :lament: no, at executable code level. < 1190017556 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :upxing gave me a 14% compression thing. < 1190017570 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :14% of uncompressed executable data < 1190017596 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :i was wondering if anybody tried doing code compression. :) < 1190017607 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :so you can also identify reusable brainfuck patterns < 1190017612 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :like a library of sorts. < 1190017635 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :hmm. the next best thing: a portable brainfuck library :D < 1190017637 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :hehe < 1190017638 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :i'm not sure whether "at executable code level" is meaningful. < 1190017658 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :there're several macro preprocessors for brainfuck, though. < 1190017662 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :lament: http://guilt.bafsoft.net/downloads/wip/Brainfuck.tar.bz2 check this out. < 1190017682 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :LostKng.b compiled to an executable of size 2 odd megs. < 1190017692 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :oh, i see < 1190017733 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :you know, which is why i wondered if there would be a way to reduce code. < 1190017745 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :like combining a compiler with a compressor. ;) lol < 1190017748 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :yes, of course. < 1190017815 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :hmm. one easy way to partition it is to take loops which lead to the same text pattern. make them functions with labels. call them instead of jumping to them, and return back. < 1190017837 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :that way you could save considerable space. < 1190017855 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :you're not passing any data through the stack, which makes it a little slower, but smaller < 1190017874 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :also, identify patterns of brainfuck code that can be compiled into single instructions < 1190017972 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :ie balanced loops < 1190018055 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :i'm already coercing shifts and additions < 1190018069 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :is that what you are talking about? < 1190018144 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :er. balanced loops < 1190018145 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :er. balanced loops? < 1190018153 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :didn't get that one? < 1190018176 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :loops which don't move the memory pointer < 1190018181 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :eg [->++<] < 1190018200 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :that don't move it? < 1190018215 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :the memory pointer is unchanged by the loop < 1190018233 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :the effect is m[mp+1] = m[mp] * 2; m[mp] = 0; < 1190018240 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :well. but it's used to increase the adjacent cell by twice the current cell value < 1190018247 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :yea < 1190018252 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :i'm not sure what the "but" in your sentence means. < 1190018286 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :for small shifts it's okay. but with a moving loop and shift it's impossible. < 1190018317 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :like, to set all values to zero (of lower and current cell): [[-]<] < 1190018363 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :that's not a balanced loop. < 1190018367 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :yea < 1190018376 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :but [-] is < 1190018378 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :oh okay :) < 1190018406 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :hm. i see. a balanced loop contains balanced loops and doesn't change the memory pointer position\ < 1190018442 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :alright. will read a bit about this :) < 1190018443 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :brb < 1190018447 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :good night < 1190019303 0 :sebbu2!unknown@unknown.invalid NICK :sebbu < 1190019648 0 :RedDak!n=dak@87.18.81.252 JOIN :#esoteric < 1190022504 0 :SEO_DUDE55!unknown@unknown.invalid QUIT :Read error: 104 (Connection reset by peer) < 1190023119 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :back < 1190023125 0 :Guilt!unknown@unknown.invalid PRIVMSG #esoteric :lament, you slept? < 1190024074 0 :SEO_DUDE55!i=Deee@gateway/tor/x-2da4bbf883d938fb JOIN :#esoteric < 1190025343 0 :Guilt!unknown@unknown.invalid QUIT :"CGI:IRC at http://freenode.bafsoft.ath.cx:14464/ (Ping timeout)" < 1190025357 0 :Guilt!n=ca361a78@cpe-74-76-59-19.nycap.res.rr.com JOIN :#esoteric < 1190025673 0 :SEO_DUDE55!unknown@unknown.invalid QUIT :Remote closed the connection < 1190028395 0 :Guilt!unknown@unknown.invalid QUIT :"CGI:IRC at http://freenode.bafsoft.ath.cx:14464/ (EOF)" < 1190029938 0 :ehird`!n=ehird@user-5af069d2.wfd101.dsl.pol.co.uk JOIN :#esoteric < 1190031191 0 :helios24!unknown@unknown.invalid QUIT :Read error: 60 (Operation timed out) < 1190034181 0 :rutlov!n=voltur@217-68-166-105.dynamic.primacom.net JOIN :#esoteric < 1190034215 0 :helios24!i=helios@tomakin.niobe.hellzilla.de JOIN :#esoteric < 1190034541 0 :rutlov!unknown@unknown.invalid PART #esoteric :? < 1190035091 0 :oklopol!unknown@unknown.invalid PRIVMSG #esoteric :this time i actually understood (partly) what edwardk said! < 1190035099 0 :oklopol!unknown@unknown.invalid PRIVMSG #esoteric :oh the joy < 1190039161 0 :SimonRC!unknown@unknown.invalid PRIVMSG #esoteric :dadadadom < 1190039170 0 :ehird`!unknown@unknown.invalid PRIVMSG #esoteric :what did he say < 1190039196 0 :SimonRC!unknown@unknown.invalid PRIVMSG #esoteric :I was quoting Beethoven. < 1190039264 0 :ehird`!unknown@unknown.invalid PRIVMSG #esoteric :edwardk < 1190039266 0 :ehird`!unknown@unknown.invalid PRIVMSG #esoteric :i meant < 1190039397 0 :SimonRC!unknown@unknown.invalid PRIVMSG #esoteric :ahell of a lot < 1190040134 0 :oklopol!unknown@unknown.invalid PRIVMSG #esoteric :even though i'm pretty sure i understood, i am certainly not confident enough to try to explain it to you, so check the logs :P < 1190040216 0 :oklopol!unknown@unknown.invalid PRIVMSG #esoteric :i didn't get all of the monad stuff, but i mean last time i didn't understand one single sentence completely, i'm pretty sure :P < 1190040263 0 :oklopol!unknown@unknown.invalid PRIVMSG #esoteric :i did understand the idea, that was pretty obvious, but he's got a lot of words < 1190040910 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :SimonRC: Leck mich im Arsch < 1190040968 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :(just quoting beethoven) < 1190040975 0 :ehird`!unknown@unknown.invalid PRIVMSG #esoteric :mozart < 1190040976 0 :ehird`!unknown@unknown.invalid PRIVMSG #esoteric :actually < 1190041008 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :damnit < 1190041035 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :stupid identical old guys < 1190043433 0 :RedDak!unknown@unknown.invalid QUIT :Remote closed the connection < 1190044723 0 :jix!n=jix@dyndsl-091-096-059-027.ewe-ip-backbone.de JOIN :#esoteric < 1190048869 0 :oerjan!n=oerjan@hagbart.nvg.ntnu.no JOIN :#esoteric < 1190049665 0 :SimonRC!unknown@unknown.invalid PRIVMSG #esoteric :bsmntbombdood: ?! < 1190050232 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :beethoven and mozart, presumably. famous decomposers. < 1190050509 0 :SEO_DUDE55!i=Deee@gateway/tor/x-939472fe7c992228 JOIN :#esoteric < 1190051091 0 :SimonRC!unknown@unknown.invalid PRIVMSG #esoteric :ACTION goes < 1190052939 0 :_D6Gregor1RFeZi!unknown@unknown.invalid NICK :GregorR < 1190054948 0 :sp3tt!n=sp3tt@80-162.cust.umeaenergi.com JOIN :#esoteric < 1190055995 0 :oerjan!unknown@unknown.invalid QUIT :"leaving" < 1190058207 0 :sebbu2!n=sebbu@ADijon-152-1-76-54.w83-203.abo.wanadoo.fr JOIN :#esoteric < 1190059359 0 :sebbu!unknown@unknown.invalid QUIT :Connection timed out < 1190060009 0 :ehird`!unknown@unknown.invalid PRIVMSG #esoteric :ACTION is a famous decomposer < 1190060259 0 :RodgerTheGreat!unknown@unknown.invalid PRIVMSG #esoteric :like a maggot? < 1190060268 0 :ehird`!unknown@unknown.invalid PRIVMSG #esoteric :and beethoven and mozart < 1190060291 0 :RodgerTheGreat!unknown@unknown.invalid PRIVMSG #esoteric :no, those two are decomposing composers < 1190060327 0 :RodgerTheGreat!unknown@unknown.invalid PRIVMSG #esoteric :beethoven, for example, wasn't famous for his decomposing until after his death < 1190060474 0 :ehird`!unknown@unknown.invalid PRIVMSG #esoteric :oerjan < 1190060474 0 :ehird`!unknown@unknown.invalid PRIVMSG #esoteric :17:29:47 < 1190060474 0 :ehird`!unknown@unknown.invalid PRIVMSG #esoteric :beethoven and mozart, presumably. famous decomposers. < 1190060479 0 :ehird`!unknown@unknown.invalid PRIVMSG #esoteric :so ha < 1190062409 0 :RedDak!n=dak@87.18.81.252 JOIN :#esoteric < 1190063184 0 :bsmnt_bot!unknown@unknown.invalid QUIT :Read error: 145 (Connection timed out) < 1190063677 0 :bsmntbombdood!unknown@unknown.invalid QUIT :Read error: 110 (Connection timed out) < 1190065146 0 :jix!unknown@unknown.invalid QUIT :"CommandQ" < 1190066621 0 :oerjan!n=oerjan@hagbart.nvg.ntnu.no JOIN :#esoteric < 1190067042 0 :bsmntbombdood!n=gavin@71-208-206-137.hlrn.qwest.net JOIN :#esoteric < 1190069313 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :how much work is a compiler allowed to do and still be called a compiler? < 1190069527 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :just about anything? < 1190069559 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :remember that a compiler cannot access actual runtime input, which limits things < 1190069573 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :only a little < 1190069593 0 :ehird`!unknown@unknown.invalid PRIVMSG #esoteric :ACTION thinks that in /me's perfect language, compiler and interpreter would be the same word! < 1190069955 0 :ehird`!unknown@unknown.invalid QUIT : < 1190070092 0 :ehird`!n=ehird@user-5af069d2.wfd101.dsl.pol.co.uk JOIN :#esoteric < 1190072594 0 :GregorR!unknown@unknown.invalid PRIVMSG #esoteric :bsmntbombdood: Compilers are just language translators that target languages not intended to be read by humans. < 1190072614 0 :GregorR!unknown@unknown.invalid PRIVMSG #esoteric :bsmntbombdood: If your program does something aside from language translation, it's not a compiler. < 1190072643 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :i was thinking about optimizations < 1190072651 0 :GregorR!unknown@unknown.invalid PRIVMSG #esoteric :I guess I can remove the clause "not intended to be read by humans" < 1190072686 0 :GregorR!unknown@unknown.invalid PRIVMSG #esoteric :bsmntbombdood: Optimization is a component of the translation. It's like translating a phrase into a coined expression instead of into a roundabout explanation. < 1190072705 0 :GregorR!unknown@unknown.invalid PRIVMSG #esoteric :(To compare it to real language translation) < 1190072849 0 :RedDak!unknown@unknown.invalid QUIT :Remote closed the connection