00:06 (nick) Nanakhiel -> Lajla 00:53 (quit) TOSTO: Read error: Connection reset by peer 01:40 (join) shofetim 01:46 shofetim: I would like to share a simple commandline program that I have written (in racket on linux) with a friend that is also running linux, but not require him to install racket... 01:46 shofetim: is there a way to make a self contained standalone exe? 01:47 shofetim: I've had a look at raco exe, and raco ctool but don't see how to make one file I can send him and he can just run it. 01:51 neilv: "raco distribute" might be the closest you can get 01:52 shofetim: I don't know enough C, but maybe compile to C source and then compile that? 01:52 shofetim: raco distribute (As far as I can tell) can't make a single file? 01:56 (part) shofetim: "ERC Version 5.3 (IRC client for Emacs)" 02:01 (join) vu3rdd 02:11 (join) jonrafkind 02:16 Lajla: samth, I was paraphrasing you when you called me strange. 02:16 Lajla: I would say that lisp is a hassle to write imperative programs in because (set! x exp) is simply not as convenient as x = exp 02:20 (quit) neilv: Ping timeout: 250 seconds 02:30 (join) neilv 03:14 (quit) jonrafkind: Ping timeout: 240 seconds 03:50 Lajla: Also, I'm not sure why imperative is necessarily mutation. 03:51 Lajla: I would consider scheme imperative regardless of mutation, a bangless scheme program is still a sequence of steps to take, just none of these steps involves chaning the value of some praeviously allocated memory 04:40 eli: Lajla: imperativeness can include other things like IO, or exceptions, or whatever; but not all scheme programs are imperative in this way. 04:41 eli: (And if we're really picky, then there is no such a thing as a non-imperative popular programming language.) 04:49 Lajla: eli, well, the most simple definition to me of imperative is a sequence of steps that must be executed in some order to praeserve meaning. 04:49 Lajla: A language which is fully declarative, like pure prolog, all meaningful units in there can be in any order. 04:49 Lajla: Or for instance lazy K. 04:49 eli: What are the sequence of steps in (define (foo x) (add1 x)) ? 04:50 Lajla: Bascailly your program is a function from input to output. 04:50 Lajla: Well, that is declarative surely. 04:50 Lajla: But that is not really a scheme program. 04:50 eli: rudybot: eval (define (foo x) (add1 x)) 04:50 Lajla: But let's say we have (define (foo x) (bla x)) and then (define q foo) 04:50 eli: rudybot: any complaints? 04:50 rudybot: eli: bpalmer, ah, yeah I should ;p I hear lots of complaints about it but I'm so used to using it haha 04:50 Lajla: eli, let me rephrase 04:50 eli: Lajla: Yes, then what? 04:51 Lajla: THat is not a meaningful scheme program that does anything. I mean in php, the program '3' is a program. It just does ntohing meaningful. 04:51 Lajla: But you can call that declarative. 04:51 Lajla: You declare the end value to be 3, nothing more 04:51 Lajla: But I do believe that imperative / declarative is a feature of programs, not of languages, but some languages do not allow programs to be one of either. 04:52 eli: If "imperative / declarative is a feature of programs, not of languages" then you made my point: "scheme imperative regardless of mutation" is bogus. 04:53 Lajla: Quite, I rephrase. 'I would consider almost all scheme programs imperative regarldess of mutation' 04:53 Lajla: It's still a sequence of steps, just not a sequence of steps which involves changing praeviously allocated values. 04:54 Lajla: And in some implementations, define on the top level is interchangeable with set! 04:55 eli: Originally, the discussion was about Racket -- where `define's at a module's toplevel are most certainly not like `set!'. 04:55 eli: In any case, there are very large parts of the Racket code base that are not imperative, so IMO "most" is misleading. 04:56 Lajla: Also, mutation can be expressed declaratively. Say we have some datum which represents that state of our machine at every unit of time, and say we have a function which takes as argument the last state, and produces the new state from it, surelly this is then completely declarative, we define this function. But it still handles state and mutation. 04:56 eli: s/most/almost/ 04:56 eli: It doesn't. 04:56 Lajla: I would disagree there depending on your definition of imperative versus declarative. 04:56 eli: It *emulates* mutation (by keeping an explicit store representation). 04:56 Lajla: Which is admittedly vague and not uniform. 04:57 Lajla: What is the difference between emulating mutation and handling mutation in a declarative way? 04:57 eli: The most common definition of "imperative" is using side-effects like IO and mutation. Large parts of Racket don't do that. 04:57 Lajla: If you use that definition then I would agree. 04:58 eli: ...and what's your definition that leads to "almost"? 04:59 Lajla: But I find that definition weird since you can also say that all variables are initialized to a value which is just an error if you retrieve it. And then define becomes identical to set! showing that 'mutation' is in the eye of the beholder. 04:59 Lajla: As I said, my edefinition of imperative is a sequence of steps where the order is relevant. 04:59 Lajla: You tell a computer what to do. 04:59 Lajla: Declarative is describing the state of some thing to a computer and then letting the computer basically figure out what to do. 05:00 Lajla: I mean (define x y) is pretty imperative, you tell a compute 'define the variable x as the result of the expression y' 05:00 eli: (a) you can most certainly *not* say that variables are initialized to undefined values in Racket code -- this is *Racket*, not some `load'-based R5RS Scheme. 05:00 Lajla: Why can't you? 05:01 Lajla: What is the effective difference? 05:01 eli: Specifically, (define x y) in a Racket module is doing exactly the same it does in Haskell or prolog or whatever. There is *no* mutation at the language level. 05:01 Lajla: To say that variables are initialized to a value which produces an error when retrieving them doesn't change any semantics of programs as far as I know. 05:01 eli: The fact that there's some VM that performs a binding by setting some pointer is irrelevant (and indeed, it happens in all of these languages). 05:02 eli: Sure it does. 05:02 Lajla: I'm pretty sure that it's not the same, for instance (define x (if cond then else)) is legal in racket. 05:02 Lajla: Whereas in haskell x = if cond then else has a different meaning. 05:02 eli: Huh? 05:02 eli: If the code has no IO and no mutation, they mean the same. 05:03 eli: rudybot: eval (module foo racket/base (define x 1) (define x 2)) 05:03 rudybot: eli: error: eval:1:45: module: duplicate definition for identifier at: x in: (define-values (x) 2) 05:03 Lajla: Ah yeah, that's a good point why it's not set! 05:03 eli: If you "could say that ...blah...", then that should have worked. 05:03 eli: Yes, exactly. 05:03 Lajla: But still, the order of the defines is relevant. 05:04 Lajla: And we can still say that define is basically (if (undefined? x) (set! x bla)) 05:04 Lajla: (else error) 05:04 eli: No, you cannot say that. 05:04 Lajla: Why not? 05:05 eli: There is no way -- in racket -- to have an (undefined? x) function. 05:05 Lajla: True, but it's a special form in my simulation 05:05 Lajla: (undefined? x) checks if x is bound to that hypothetical error value 05:06 eli: That's some hypothetical world that is unrelated to the racket reality. 05:06 eli: You just can't do that. 05:06 Lajla: Maybe it is, but it produces the same functionality in programs. 05:06 Lajla: Showing that what makes mutation and what makes a definition is in the eye of the beholder. 05:06 eli: In any case, even just `set!'ting a variable changes the semantics -- if there is no `set!' (= in most cases where there is only `define'), then the binding is immutable. 05:07 eli: OK, so were now down to "eyes of beholders", and some weird private definition that you're using, and hypothetical extensions that cannot be part of reality. 05:08 eli: IMO, all of this justifies me saying that "almost all" is misleading. 05:08 Lajla: Yes, but it would still be the same as initializing all variables to that error value and set!ing them. 05:08 Lajla: I'm just showing that you can get the exact same effective semantics where it is suddenly mutation. 05:08 eli: But sure -- given all of the above hocus pocus being part of your view, it would be different. 05:08 Lajla: Both definitions of it are aequivalent and lead to the same model. 05:08 eli: No you can't -- in relity. 05:09 Lajla: What do you mean with 'in reality'? 05:09 eli: Like I said above -- using a `set!' in a racket module has different semantics than `define'. 05:10 Lajla: THat's displacing the point, it needn't be set! at all, let's say it's a special form called lajla!, what it does is it mutates only that error value and on any other value it will produce an error. 05:11 Lajla: What's the difference between lajla! and define at this point? Provided that when we use lajla! all values are initialized to that value which is an error to retrieve 05:11 eli: I can tell you what you're trying to describe: 05:11 eli: it's the low-level implementation of a definition. 05:12 eli: It does exist there -- in the implementation -- but it's not part of the language, and in the case of racket, it's intentionally not part of it. 05:12 eli: Oh and BTW -- if you want to talk about pickiness and such, I can claim that Haskell or prolog or whatever are also imperative languages. 05:12 Lajla: I would call haskell imperative. 05:12 Lajla: But not pure prolog. 05:12 Lajla: Or let me rephrase, 'I would call the average haskell program imperative' 05:12 neilv: real prolog is imperative :) 05:13 eli sighs 05:13 Lajla: But my point is that if you see it in my hypothetical way, it does the same, but it suddenly uses mutation. 05:13 eli: Prolog is *very* much imperative. 05:13 Lajla: Why? 05:13 eli: In the case of prolog that's easy. 05:14 eli: First, you get IO in all practical prologs. Just like in the other practical language that we're talking about. 05:14 Lajla: Sure 05:14 Lajla: but not in pure prolog. 05:14 eli: (So your argument holds just the same for "pure racket".) 05:14 eli: Second, unification in prolog is a side-effect. 05:15 eli: (I'm not even going to talk about cut and such...) 05:15 eli: Third, prolog has errors -- and that's a side effect too. 05:15 Lajla: As I already said, in your definition of 'declarative' which means 'no mutations, and side effects', I would say that a large part of racket is declarative. 05:15 (quit) rudybot: Read error: Operation timed out 05:15 Lajla: But I'm just saying that 'mutation' is a vague thing that seems to depend on how you look at it if it's a mutation or not. 05:16 eli: No, it's either part of the language or not. Whatever you're (trying to) talk about is not something that is in the langugae. 05:17 eli: There's also the fourth point: prolog is turing-complete, therefore it's imperative. 05:18 (join) rudybot 05:18 Lajla: Well, I disagree here, I was able to describe a form which has the exact same effect as define but suddently define does not cause mutation, but lajla! does. 05:18 Lajla: It at least shows that mutation or not is not a category of the exact effects a form has. 05:19 eli sighs again 05:19 eli: That `lajla!' thing is there in any language. 05:19 Lajla: Is it there in lazy K 05:19 Lajla: ? 05:20 Lajla: (Lazy K just works with SKI calculus to compose a function from input to output) 05:20 eli: Prolog has no idea what `foo' is, then you define it, and all of a sudden there is a `foo' -- *that's* the side effect you're talking about, and it's there in any langugae that has bindings. 05:20 eli: (But of course it's in the implementation of these languages -- racket is not different here.) 05:21 eli: Is Lazy K turing-complete? 05:21 Lajla: Yes. 05:21 Lajla: SKI is turing complete. 05:21 eli: So it has side effects. 05:21 Lajla: turing completeness says nothing about side effects as far as I know. 05:21 eli: Can you write an infinite loop in SKI? 05:22 eli: s/in/with/ 05:22 Lajla: But no, lazy K does not have side effects, it does have I/O though. It works pretty weird, you just make one function in SKI terms, which the interpreter then considers as a function from the stream of input to the stream of output and tries to form I/O out of it. 05:22 Lajla: Sure. 05:22 Lajla: SKI is turing complete. 05:22 eli: Then it has side effects. 05:22 Lajla: How so? 05:22 Lajla: Define 'side effect' then. 05:22 eli waits for the inevitable argument... 05:23 eli: Oh, you already made it... 05:23 eli: An infinite loop is a side effect. 05:23 Lajla: I'm pretty sure pure lambda calculus has no side effects, it just runs in a black box and you can't see it, but it's still turing complete. 05:23 Lajla: As in, a program that never ends you consider a side effect? 05:23 Lajla: I guess you can call it like that. 05:23 eli: Non-termination is a side-effect. 05:24 eli: I can try to explain it, but given how you're going to argue everything I say at this point, I'll just point you at the nearest library holding some material on semantics. 05:24 Lajla: Okay, then I'm even more puzzled to the meaning of the term 'declarative' if it means: no side effects and non-termination is considered one. 05:24 Lajla: Go ahead, I'll shut up. 05:50 (quit) neilv: Quit: Leaving 06:18 (join) masm 07:40 (quit) masm: Ping timeout: 240 seconds 08:08 (join) confounds 08:18 Lajla: eli? 08:25 (part) ttuttle 08:33 (join) masm 08:46 (join) b-man_ 09:24 (join) writer 09:44 (join) hanDerPeder 09:46 (part) confounds: "xruby: now is begin from null that begin supplier dude Unixmonkey" 09:49 (join) Fare 09:50 Fare: eli: What is @|!@!{foo}!@!| ? 09:57 samth: Lajla, I recommend this paper: www.cs.indiana.edu/~sabry/papers/purelyFunctional.ps 09:57 samth: Fare, that's an error 09:58 Fare: the doc doesn't say that @ is forbidden in alternative body syntax, but maybe it should 09:58 Fare: and similarly for | 09:58 samth: the error message for that is: a @|...| form in Scheme mode must have exactly one escaped expression 09:58 Fare: and } probably 09:59 samth: Fare, to quote the docs "Characters that are put there (non alphanumeric ASCII characters only, excluding { and @)" 10:00 samth: referring to the what goes between @| and { 10:00 samth: it's not a great error message 10:00 Fare: and | is probably forbidden, too. 10:01 samth: nope, this works: 10:01 samth: @list||{foo}|| 10:01 Fare: also, what's the treatment of CRLF sequences and tabs in text body? 10:02 samth: http://docs.racket-lang.org/scribble/reader.html#%28part._.Spaces__.Newlines__and_.Indentation%29 10:02 (notice) rudybot: http://tinyurl.com/23o8cgg 10:02 Fare: I get different results when I run my #lang at-exp racket thingie than when I type at the interaction prompt. 10:03 samth: that seems to indicate no special handling of CR or TAB 10:03 samth: the former is more likely to be correct 10:03 samth: since it involves fewer other systems 10:03 samth: but differences might be bugs in the REPL 10:03 Fare: so tabs count as normal characters? 10:03 samth: i think so 10:04 Fare: gah! 10:04 samth: you might want to discuss that with eli though 10:04 Fare: then I have to reinvent column tracking, because the underlying implementation may count differently... 10:04 samth: probably there could be a mode where tabs were treated as a user-configurable number of spaces 10:04 Fare: cans of worms. 10:04 samth: tabs = evil 10:05 Fare: evil as in "it's ok if it crashes your system"? 10:05 samth: oh, quick reader-hacking pro tip: use the macro stepper 10:05 samth: when you open the macro stepper, the first thing shown is what `read' produces 10:06 samth: so any reader extensions such as @ have been processed 10:06 samth: no, i don't think crashing on tabs is ok 10:07 samth: biab 10:08 Fare: '(@|(!)|{blah}|(!)|) vs '(@|(a)|{blah}|(a)|) 10:11 samth: the example with the ! breaks drracket's syntax colorer 10:11 samth: i'm reporting the bug now 10:13 samth: reported 10:17 Fare: '(@|(!)|(!)(a)|{blah}|(a)(!)|(!)|) 10:18 Fare: OUCH -> it's clearly not LL(1). 10:18 Fare: in CL, could emulate backing up more than one character by using concatenated streams, but oh my. 10:20 Fare: (problem being, to delegate some parts to the standard reader, you can't use your own stream abstraction - or you have to provide a standard stream interface and reimplement quite a lot...) 10:20 Fare: a complete implementation of his scribble syntax in CL is going to be quite non-trivial. 10:21 (join) MayDaniel 10:21 Fare: have to use gray-streams with infinite unread-char or such, plus exactly tuned column counting. 10:22 samth: i don't even understand what that example behaves that way 10:23 samth: s/what/why/ 10:24 Fare: which? 10:24 Fare: my latest example? 10:24 samth: your non-LL example 10:25 Fare: well, it tries to identify a |...{ expression, fails, and backtracks. 10:26 Fare: which is all well and fine, except it's now your have to re-parse everything between the | and the failing character as if it were a |...| expression followed by something else. 10:26 Fare wonders about nesting || inside that... 10:28 Fare: works: '(@|(|!?|)|(!)(a)) 10:28 samth: eli has thought about everything 10:28 samth: except perhaps tabs 10:29 Fare: yup. But I definitely need some non-trivial backtracking or at least unread'ing, in addition to non-trivial column-counting. Sigh. 10:30 samth: i can't find the unreading or backtracking in the source, but you should really ask eli all these things 10:30 Fare: thanks. 10:31 Fare: where are the sources, already? 10:31 samth: collects/scribble/reader.rkt 10:31 Fare: I wanted to make a clean-room re-implementation, but maybe I should read the source. 10:31 Fare: thanks, btw 10:31 samth: have you read the paper? 10:32 Fare: I've read one paper plus the doc. 10:32 Fare: it's not fresh in memory, was weeks ago. 10:34 samth: ok 10:34 Fare: paper: do you mean the 2009 "The Scribble Reader" by Eli, or the 2009 ICFP paper by Matthew, Eli & Robby? 10:41 Fare: actually, the unlimited backtracking problem means it can't integrate with the CL reader as used by LOAD, as it won't be using my fancy stream. 10:42 Fare: gah. 10:42 Fare: and/or it will have to error out on some corner cases - which I suppose is acceptable 10:43 Fare: just don't you play games with @|...| 10:44 Fare: (or maybe eli is just subtly trying to steer me away from CL by having me confront its limitations) 10:45 samth: the paper i meant was the 2009 SFP paper by Eli 10:45 samth: the other paper is almost entirely about the documentation system 10:46 (join) mceier 10:46 samth: wait, CL reader extensions don't give you access to the stream? 10:46 mario-goulart: http://blog.leftparen.com/post/1268878953/leftparen-is-no-longer-being-developed 10:46 (notice) rudybot: http://tinyurl.com/2vdqhf9 10:47 mario-goulart: Do you know why? ^ 10:48 (join) C-Keen 10:51 samth: mario-goulart, i assume Rob went on to other things 10:53 mario-goulart: Sounds reasonable. 11:00 Fare: samth, yes, I have access to the stream, I can wrap around it an unlimited unread wrapper, but when I'm done parsing my subexpression and I have looked >1 char ahead, how do I give those chars back to the rest of the reader? 11:09 (quit) b-man_: Remote host closed the connection 11:19 samth: hmm 11:19 samth: i don't know 11:19 samth: i'd look at Eli's implementation, and see what he does 11:25 Lajla: samth, hmm, this is the point I realize I actually don't even have a postscript reader 11:27 samth: i recommmend Linux 11:28 (quit) vu3rdd: Remote host closed the connection 11:30 (join) dzhus 11:30 (join) danbrown 12:03 (quit) MayDaniel: Read error: Connection reset by peer 12:03 (quit) danbrown: Quit: danbrown 12:04 Lajla: samth, but that doesn't play StarCraft II =( 12:09 (join) jonrafkind 12:15 Lajla: jonrafkind, ich will unreal tournament spielen 12:15 jonrafkind: wombat patrol in berlin 12:16 Lajla: Ah, that is beyond your knowledge of internet references I see. 12:16 Lajla: the battle is mine, I took victory this day 12:16 jonrafkind: oh that video 12:17 Lajla: Starte das verdamte spiel, ich will unreal tournament spielen. 12:17 Lajla: jonrafkind, I think it's fake. 12:18 jonrafkind: theres a good mashup of that video, hold on 12:18 Lajla: Because I suspect him to kill the camera in that mood and the person who randomly decides to film him. 12:18 Lajla: Also,you get killed in UT all the time, specially when you search for your escape knopf. 12:19 jonrafkind: http://www.youtube.com/watch?v=-oT-6s4XqGE 12:19 jonrafkind: i guess you have to watch that other video too to appreciate it 12:28 Lajla: jonrafkind, I guess this and those hitler translations don't work on you when you understand German. =( 12:29 jonrafkind: ha probably 12:29 jonrafkind: those hitler videos are hilarious 12:30 Lajla: It's a shame I am a polyglot. =( 12:30 Lajla: There comes a price with being ultra awesomely learnt 12:38 (join) MayDaniel 12:44 (join) Nanakhiel 12:46 (quit) Lajla: Ping timeout: 260 seconds 12:50 (quit) MayDaniel: 13:11 (join) carleastlund 13:19 (nick) Nanakhiel -> Lajla 13:23 (quit) masm: Quit: Leaving. 13:33 (join) masm 13:49 (join) MayDaniel 14:08 jonrafkind: where is casey? 14:08 jonrafkind: he hasnt been online for a while 14:13 (join) vu3rdd 14:23 Lajla: jonrafkind, er ist unreal spielen. 14:59 (join) tommc 15:01 (quit) dzhus: Read error: Connection reset by peer 15:03 (join) b-man_ 15:04 (join) dzhus 15:11 (quit) tommc: Ping timeout: 265 seconds 15:17 (join) grettke 15:19 (join) PascalHunger 15:25 PascalHunger: Hi, any of you make websites in scheme/racket? I would like to, any pointers? popular frameworks? libraries, doesn't it come with web stuff out of the box? 15:25 Lajla: PascalHunger, I'm trying to. 15:25 Lajla: So any person answering you, I'd like to listen. 15:25 Lajla: But basically, do you know SXML? 15:26 PascalHunger: I don't hehe 15:26 Lajla: PascalHunger, XML? 15:26 samth: PascalHunger, you should start w/ the tutorial here: http://docs.racket-lang.org/continue/index.html 15:28 Lajla: Basically you repraesent hai
as (bla (@(attr "value") (samth "Command & Conquer 4: Tiberian Emo Vampire Film"))"hai " (br)) 15:28 PascalHunger: I am very new to scheme too , but i pick up quick 15:29 Lajla: PascalHunger, hwat other programming experience do you have. 15:30 PascalHunger: Lajla: c/c++ php/python/ruby , smalltalk 15:30 Lajla: Welcome to the woundrous world of praefix notation, where stuff suddenly makes sense. 15:30 Lajla: PascalHunger, but why a site in racket/scheme then? 15:30 PascalHunger: because i like scheme :) 15:30 PascalHunger: so far 15:31 PascalHunger: and since I mostly do web dev its a good time to learn / have some fun 15:34 Lajla: Lisp is serious business, having fun is illegal. 15:34 Lajla: Now dress up in black and black and start complaining about how people don't work hard enough and get one of those sexy black hats and beards. 15:37 jonrafkind: black hat and beard.. so you can look like robert jordan? 15:49 Lajla: jonrafkind, like a calvinist 15:49 Lajla: http://blog.beliefnet.com/reformedchicksblabbing/calvin.jpg 15:49 Lajla: He worked so hard 15:49 jonrafkind: looks like a l33t hacker 15:57 Lajla: jonrafkind, hackers are all sober, complain a lot and work hard. 15:57 Lajla: so calvinism to the max 15:58 jonrafkind: he must have been fun at parties 15:58 (join) lisppaste 16:07 Lajla: jonrafkind, that's like saying that WMD's must have been fun in Iraq. 16:08 jonrafkind: they may have been compared to what else is there 16:08 grettke: oh yea the Calvinism/WMD paralell... right 16:09 (join) danbrown 16:14 (quit) MayDaniel: 16:14 (quit) grettke: 16:30 (quit) dzhus: Remote host closed the connection 17:05 (join) MayDaniel 17:16 (quit) writer: Quit: writer 17:26 (quit) vu3rdd: Remote host closed the connection 17:41 (quit) MayDaniel: 17:54 (quit) mceier: Quit: leaving 18:01 (quit) jonrafkind: Read error: Operation timed out 18:08 (quit) jao: Read error: Connection reset by peer 18:37 (quit) danbrown: Quit: danbrown 19:05 (quit) carleastlund: Quit: carleastlund 19:54 (join) Orukum 19:55 Orukum: Hey, is there some function I can use to break up a string based on a character? Like "Hello Everybody!" -> "Hello" "Everbody!" (sorry I'm a bit new to racket) 20:00 chandler: rudybot: init racket 20:00 rudybot: chandler: your racket sandbox is ready 20:00 chandler: rudybot: eval (regexp-split #rx" " "Hello Everybody!") 20:00 rudybot: chandler: ; Value: ("Hello" "Everybody!") 20:00 chandler: Orukum: Like so? 20:02 Orukum: Thank you 20:36 Orukum: Is there a way to set a variable without using define because I want to define a variable within a conditional. like: (cond [#t (define x 5)) which gives me an error 21:02 (quit) martinhex: Remote host closed the connection 21:22 (join) martinhex 21:31 (quit) masm: Quit: Leaving. 21:33 (part) Orukum 21:37 (quit) b-man_: Ping timeout: 264 seconds 22:03 (join) drdo 23:05 (quit) PascalHunger: Remote host closed the connection 23:44 (join) ttuttle 23:45 ttuttle: define-syntax is perhaps the most amazing thing ever. 23:45 ttuttle: "It's annoying that hash-set only takes one key-value pair. Oh, I know, I'll just implement my own version that nests calls to hash-set to set multiple values."