00:00 (quit) dented42: Quit: Computer has gone to sleep. 00:33 (join) dented42 00:34 (join) jeapostrophe 00:47 (join) cdidd 00:51 (quit) jao: Ping timeout: 260 seconds 00:53 (quit) manu3000: Quit: manu3000 00:59 (quit) Fare: Quit: Leaving 01:15 (join) adu 01:31 (quit) jacius: Remote host closed the connection 01:34 (quit) neilv: Quit: Leaving 01:38 (quit) jeapostrophe: Ping timeout: 240 seconds 01:40 (quit) dnolen: Remote host closed the connection 02:14 PfhatHome: Is it possible to build racket as a static library, instead of as a DLL on Windows? 02:18 (quit) jonrafkind: Ping timeout: 256 seconds 02:29 (quit) Kaylin: Read error: Connection reset by peer 02:39 (join) nilyaK 02:55 (quit) adu: Quit: adu 03:01 (join) jesyspa 03:04 (join) hkBst 03:04 (quit) hkBst: Changing host 03:04 (join) hkBst 03:18 (join) djcoin 03:43 (quit) kvda: Quit: Computer has gone to sleep. 03:59 (join) noelw 04:07 (quit) mceier: Ping timeout: 252 seconds 04:19 (join) mceier 04:26 (join) tim-brown 04:26 (quit) jyc: Read error: Connection reset by peer 04:38 (join) noelw_ 04:40 (quit) noelw: Ping timeout: 252 seconds 04:40 (nick) noelw_ -> noelw 04:44 (join) Shvillr 04:45 (join) snearch 04:46 (quit) snearch: Remote host closed the connection 04:46 (join) snearch 04:47 (quit) snearch: Read error: Connection reset by peer 04:47 (join) snearch 04:47 (quit) snearch: Read error: Connection reset by peer 04:48 (join) snearch 04:49 (quit) snearch: Client Quit 04:50 (join) snearch 05:28 (join) mye 05:44 (join) kvda 05:59 (quit) mye: Ping timeout: 248 seconds 06:06 (join) Shambles_ 06:10 (join) hyko- 06:24 (quit) kvda: Quit: Computer has gone to sleep. 06:45 (quit) nilyaK: Quit: Leaving. 06:53 (join) masm 07:08 (join) BeLucid 07:30 (join) sstrickl 08:07 (join) kanak 08:13 (quit) Shviller: Ping timeout: 265 seconds 08:13 (join) Shviller 08:15 (quit) snearch: Quit: Verlassend 08:56 (join) jeapostrophe 09:27 tim-brown: is this normal? 09:27 tim-brown: raco setup: in srfi/%3a27 09:27 tim-brown: raco setup: in srfi/%3a23 09:27 tim-brown: raco setup: in srfi/34 09:27 tim-brown: raco setup: in srfi/7 09:27 tim-brown: raco setup: in srfi/40 09:27 tim-brown: raco setup: in srfi/32 09:27 tim-brown: raco setup: in srfi/35 09:27 tim-brown: raco setup: making: srfi/%3a1 09:27 tim-brown: them percents smell odd 09:28 bremner: tim-brown: man ascii 09:28 bremner: somebody is hex encoding : I bet 09:30 tim-brown: oh, that colon is 3a -- not some smiley :-) 09:35 Shambles_: Does anyone know if Racket comes with something equivalent to Common Lisp restarts, and if not, if there would be a problem doing the same thing with Racket's continuation support? 09:47 samth: Shambles_: what do CL restarts do? 09:49 Shambles_: samth: Basically, rather than necessarily unwinding the stack when an exception occurs (e.g. the media is full or read only) it has the option to run a procedure to correct the problem (e.g. ask the user to replace/un-write-protect the media) and try again. 09:49 Shambles_: samth: They're mentioned briefly in Land of Lisp. 09:49 Shambles_: samth: Here's a link: http://www.gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html 09:49 rudybot: http://tinyurl.com/y63ugo 09:50 samth: Shambles_: you don't need continuations for that at all 09:51 Shambles_: samth: How else would you "go back to where you were", unless you mean manually storing whatever state would be needed to pick up where you left off. 09:51 samth: Shambles_: you just run the procedure when the condition happens 09:52 samth: maybe there's something i'm missing here 09:52 Shambles_: samth: Maybe the link will explain it better. 09:54 Shambles_: samth: The other two popular links are: http://chaitanyagupta.com/lisp/restarts.html and http://www.nhplace.com/kent/Papers/Condition-Handling-2001.html 09:54 asumu: Are you saying the continuation is captured at the point that the exception is raised, the exception is handled by a handler, and then execution returns to the raise point and does some restart? 09:54 asumu: Also, are restarts dynamically scoped? I got that impression from some article. 09:57 Shambles_: asumu: They are dynamically scoped. 09:58 Shambles_: asumu: As for the exact implementation, I'm not certain, but that appears to be the case. The last link I mentioned indicates that the 'hard work' is done by continuations. 10:00 Shambles_: asumu: I'm mostly interested since Land of Lisp mentioned them, and I can't find them in the Racket manuals, and most discussions of them I can find are either just people talking about how great they are, or Scheme folks complaining that they don't have them. I haven't got any experience using them, but I can see the appeal. 10:01 Shambles_: asumu: It looks like something that should be doable with continuations in Racket, at least. I'm not sure if there would be any problems, like properly handling cleanup if you actually /do/ need to unwind the stack, or something. 10:26 (join) Mungojelly 10:53 (join) anRch 11:06 (quit) jrslepak: Quit: This computer has gone to sleep 11:10 (join) adu 11:11 (nick) bro_down -> server_failure 11:18 server_failure: Can Racket be conveniently used to process text files, where traditionally people might use Awk or Perl (I'm asking because I've heard that scheme is good for 'scripting' tasks)? 11:22 (quit) jeapostrophe: Ping timeout: 245 seconds 11:22 stamourv: server_failure: I use Racket for scripts. 11:22 stamourv: It has great regexp support. 11:23 stamourv: And text processing is an area of the standard library that's actively being improved. 11:31 server_failure: I see 11:34 server_failure: It looks like Chapter 12 of the Reference would be the place to start for learning about this? 11:38 stamourv: I would recommend starting with the guide. 11:38 stamourv: The reference is, well, more of a reference. 11:39 stamourv: The docs also have some good tutorials. 11:39 stamourv: I like this one: http://docs.racket-lang.org/more/index.html 11:40 server_failure: I meant specifically for learning about text processing in Racket 11:40 server_failure: But I guess I should read the whole Guide anyway 11:40 stamourv: It's a reasonably quick read. 11:40 stamourv: But section 9 (of the guide) is probably best for text processing. 11:41 server_failure: Okay, thanks. 11:41 stamourv: There's also a couple of functions that are great when dealing with logs, but that are not always easy to find. 11:41 stamourv: rudybot: doc port->lines 11:41 rudybot: stamourv: http://docs.racket-lang.org/reference/port-lib.html#(def._((lib._racket%2Fport..rkt)._port-~3elines)) 11:41 stamourv: rudybot: doc file->lines 11:41 rudybot: stamourv: http://docs.racket-lang.org/reference/Filesystem.html#(def._((lib._racket%2Ffile..rkt)._file-~3elines)) 11:41 stamourv: server_failure: ^ 11:44 server_failure: Thanks. I spend a lot of time reading files into complex data structures, then processing them in various ways. I've always found Perl's handling of this quite tricky, so I'd love to try it in Racket to see if it's easier. 11:45 (join) RacketCommitBot 11:45 RacketCommitBot: [racket] plt pushed 1 new commit to master: http://git.io/Dacvbw 11:45 RacketCommitBot: [racket/master] fix bug in the ->i parser (picked up the wrong identifier; wrote #'id when - Robby Findler 11:45 (part) RacketCommitBot 11:52 (join) jacius 12:05 (join) samth_ 12:06 (join) antithesis 12:07 (quit) noam: Read error: Connection reset by peer 12:08 (join) noam 12:11 (join) jeapostrophe 12:11 (quit) jeapostrophe: Changing host 12:11 (join) jeapostrophe 12:11 Shambles_: server_failure: Actually, Scheme has been considered to be good for scripting. There's a implementation intended for exactly that called Scsh. 12:13 Shambles_: server_failure: Most of Scsh's features exist in Racket (and a lot that Scsh doesn't have). The exception is the 'shell' itself, and some convenient shorthand for working with files and directories. You'll need Irregex to get Scsh-style regular expressions, though a non-s-expression version comes with Racket. 12:15 (join) mye 12:16 server_failure: And I guess that once I reach a sufficient level of proficiency, I can always build my own text-processing DSL with Racket, like scsh only better! 12:17 (part) noelw 12:17 (join) noelw 12:18 (quit) samth_: Ping timeout: 252 seconds 12:20 Shambles_: server_failure: Yes, that's a general Lisp feature. Lisp macros are basically compilers you write yourself, where you can avoid writing the lexer, parser, and back end. They read in s-expressions (unless you /want/ to write your own lexer/parser, which you can do) and produce Lisp code. They don't have much in common with the simplistic and usually error-prone text substitution macros in most languages. 12:22 Shambles_: server_failure: The macros are the main reason for the 'funny syntax' in lisp. I like it myself, but I tend to like really simple, regular syntax like you find in Forths and Lisps. 12:24 Shambles_: server_failure: I'm sure it'd be appreciated if you did upload something like the Scsh shell to PLaneT. I'd use it. 12:24 Mungojelly: I saw something somewhere in the Racket guide about some language called Honu that uses something called H-expressions that are like other syntaxes that can act lispy, from what I understand? Sounds like a groovy way to go. 12:25 Mungojelly: Because you know as soon as you can make macros on infix notation, a lot of people will say "oh, ok, y'all finally ditched the parentheses? I'm on board then" ;) 12:26 Mungojelly: Racket has this pretty trick of making some of the parentheses into brackets instead, that gives a bit of variety, nice brackety racket! :) 12:30 djcoin: I'm sorry to ask this question, I don't want to troll or anything, but what would be the main differences between racket & clojure ? I'm currently discovering racket and it seems great but maybe clojure is safer (jvm performance, maybe packages etc.). I looked out for post comparing the two, but the few I found were at least 2 years old. I guess both have evolved since 12:30 djcoin: (I mean safer as in safer to make a leaving) 12:30 djcoin: (living) 12:31 Shambles_: Mungojelly: I haven't messed with things like Dylan, or the OCaml preprocessor much, but Lisp macro systems aren't exactly easy to understand at first, and I can assure you anything with a syntax more complicated than Lisp makes doing Lisp-style macros much, much more ugly. 12:31 Shambles_: Mungojelly: Then again, there are people that just love APL, so perhaps ugly is just in the eye of the beholder. 12:32 (quit) jeapostrophe: Ping timeout: 260 seconds 12:34 (join) gciolli 12:34 (quit) gciolli: Client Quit 12:36 Shambles_: djcoin: The main differences between Racket and Clojure would be, off the top of my head... You have to mark tail calls in Clojure (it doesn't do tail-call optimization automatically), and it doesn't have continuations. 12:37 djcoin: Shambles_: thanks for answering me :) 12:37 (quit) hkBst: Quit: Konversation terminated! 12:37 djcoin: And what about librairies, language "extensibility", performance ? 12:37 Shambles_: djcoin: Clojure uses software transactional memory to make mulithreading safe. Racket uses futures (dataflow concurrency) and promises (message passing concurrency). 12:37 djcoin: All right 12:38 Shambles_: djcoin: Racket libraries are Racket-specific. Clojure can call anything written in Java. That means Clojure has more libraries. 12:38 djcoin: Yeah If one want to use those "specific java" lib 12:39 Shambles_: djcoin: Racket is generally slower than Clojure. It uses about the same RAM. It often requires less code. That is, if benchmarks are to be believed. http://shootout.alioth.debian.org/u32/racket.php 12:40 Shambles_: djcoin: That said, it probably 'depends'. Typed Racket is able to optimize the code better than standard Racket. Of course you'll be adding type annotations, so that means more to write (losing the 'it takes less code' advantage). 12:41 djcoin: Shambles_: typed racket seems really great 12:41 djcoin: I like static typing 12:42 Shambles_: djcoin: It's really nice for when your code has to be fast. Most Common Lisps provide some similar mechanism. They don't usually do type checking the way Typed Racket does, as in, if it can't figure out what the type of something should be it may just check at run time. I don't think they were intended so much to add type checking (like Typed Racket does) as to just improve performance. 12:44 Shambles_: djcoin: I don't have much of an opinion either way. I like the performance gain you get from static typing. I've enjoyed statically typed languages (Cobra being my favorite). I've enjoyed dynamically typed languages. I personally don't get many type errors in what I write, but some people say they do. I more have problems with state ('values', as opposed to 'kinds of things') gradually becoming corrupted. 12:44 Mungojelly: My impression is that Racket is most mature as an educational tool, and in all its other roles its certainly more than a toy (because of its basic power & flexibility) but not very mature or integrated with things. 12:45 djcoin: Shambles_: so it really improves perf ? What I like about static typing is indeed this but also compilation errors (even you _must_ test your stuff anyhow) 12:45 Shambles_: djcoin: Which design by contract fixes for me, and Racket comes with, unlike most languages. Most languages can't even have it bludgeoned onto them... If it could I'd probably be able to tolerate C++ better. 12:46 djcoin: Yeah, I did not checked contract yet, but it seems a great idea 12:46 (join) veer 12:46 djcoin: It's amazing to see such a "meta language" 12:46 Shambles_: djcoin: Yes, static typing improves performance because it removes the need to check "is blah blah the right type before we try this operation, which would crash otherwise" at run time. It also sometimes lets the compiler do things like use SIMD instructions (usually depends on being able to recognize loops and the types involved inside the loop). 12:47 djcoin: Shambles_: would you recommend it over clojure if you got to "get stuff done" ; given "stuff" will also be related to web development ? 12:48 Shambles_: djcoin: I'm not sure if Racket can do the vectorization (use SIMD instructions) thing since it uses bytecode and JIT optimization, rather than generating assembly, but in principle, it makes that possible. I do know Typed Racket improves performance by removing runtime checks. 12:48 stamourv: djcoin: I haven't used Clojure, but Racket has a pretty mature web server. 12:49 stamourv: I hear it's really nice. 12:49 stamourv: As for general differences between Racket and Clojure, a big one is that Racket has been around for ~17 years now. It's a mature platform. 12:49 (join) jonrafkind 12:50 Shambles_: djcoin: I'm not the best person to ask about that since I don't have much interest in web development. I mostly do 'scripting' and 'application' stuff (by far mostly the former). I personally want to use Racket, or something like it, because I want "real Lisp", which involves having most of the things Clojure doesn't have, except macros (Clojure has those). 12:50 stamourv: It's also a very malleable language. You can shape it in any way you want, and the result will work with the rest of the Racket ecosystem. 12:50 (join) netrino 12:50 stamourv: E.g. want to add types? Sure! Like laziness? Try `#lang lazy'. etc. 12:50 Shambles_: djcoin: Most of Clojures limitations have to do with what the JVM can't handle. Even the weird lack of tail call optimization thing has to do with something debuggers need in Java. 12:51 (join) Demosthenes 12:51 stamourv: The DrRacket IDE is also pretty impressive. I don't know any other dynamic language with similar IDE support. 12:51 (quit) anRch: Quit: anRch 12:52 Shambles_: djcoin: For what it's worth Racket does come with its own web server and a language for generating web applications, and even I was able to follow the tutorials for getting it up and running and making a web app 'count' up and down, and store blog posts, so it can't be /that/ bad at it. :P 12:52 djcoin: stamourv: 17 years ?! Wow, great! And "malleable" that waht interests me much in racket :) great 12:52 djcoin: Shambles_: :) 12:53 Shambles_: djcoin: DrRacket's main unique feature (other Lisps don't have it) that I know of, is the macro stepper. You actually see the macro as it 'runs' rather than just the (generally unreadable) code it spewed out. 12:53 djcoin: By the way, for scripting you sure dont want to load the jvm :> 12:53 stamourv: djcoin: For a good tutorial on how to create your own language on top of Racket, I recommend Danny Yoo's BF tutorial: blog.hashcollision.org/?p=114 12:54 djcoin: Yeah I saw that :) 12:54 djcoin: Thanks for the link 12:54 stamourv: Matthew Flatt also had a nice intro to extensibility in Racket in CACM: queue.acm.org/detail.cfm?id=2068896 12:55 djcoin: great, thanks ! 12:56 djcoin: stamourv: and, i'm sorry for such a naive question (but i'm discovering lisp and such ; i come from python/javascript but i'm being tired of those): why do you want "real lisp", eg: what is real lisp ? 12:56 Shambles_: djcoin: I did my best to answer what you asked, but if I could add anything that might help you that you /didn't/ ask for, it's that the only *really good* reason to use Clojure is the astounding amount of existing Java code you can use with little to no effort. At everything else, it seems to be worse than just about any other Lisp implementation. Note that that thing about using other Java code /is/ a 'big deal'. 12:58 Shambles_: djcoin: The Common Lisp standard doesn't require continuations and tail call optimization, but all real CL implementations I'm aware of have it, for example. Clojure doesn't, again, because of the JVM, which is both its primary weakness and its primary strength. 12:59 stamourv: djcoin: I don't think that determining what is lisp and what is not is a very useful pursuit. I prefer to look for useful language features, like extensibility, flexibility, etc. 13:00 (join) anRch 13:00 stamourv: Languages in the lisp family tend to find those important, but I prefer to focus on the features and not on the language family. 13:00 djcoin: Yeah right - but it's just because I lack background in Lisp history/spirit 13:01 stamourv: A lot of people wave the word lisp around like it's some magic wand that makes everything better, but I think that's misleading. 13:01 Shambles_: djcoin: "Real Lisp" is probably up for grabs, but things you won't find in most programming languages that Lisp implementations usually have are: use all RAM for the stack (stack overflow is very unlikely), closures (other languages are starting to get this), continuations, macros (Lisp style; usually requires the 'funny syntax', or something much worse), and easy serialization (via the reader/writer). 13:02 Shambles_: djcoin: As for why I want that, well, if I'm going to bother using Lisp, I aught to have a good reason. If it's just going to be C or C++ or Python or whatever with different syntax, it's a waste of my time. For a more practical bent, I actually ran into a problem that /needed/ deep, non-tail recursion, so that "use all of RAM for stack frames" thing would have come in handy. 13:02 stamourv: So I recommend find a language that you're comfortable with, and go with that. :) 13:03 stamourv: s/find/you find/ 13:05 djcoin: :) 13:05 djcoin: Well, really thanks a lot for all your advices 13:05 djcoin: I think I will stick with racket 13:05 djcoin: and ask for more questions sooner ;) 13:06 Shambles_: djcoin: The thing I was working on was supposed to parse a file into a tree data structure. The trees could potentially be very deep. To avoid stack overflow I had to manage my own stack. After writing the code, and adding thorough error reporting (if the file was malformed), and finding it embarrassingly ugly, I decided it was time I picked up a language that solved that problem. 13:06 Shambles_: djcoin: With Lisp I can just write it recursively, the way I'd liked to have, and the only way the code doesn't end up hideous. 13:07 stamourv: djcoin: We're always happy to answer questions. :) 13:07 djcoin: :) 13:07 djcoin: Thanks a lot really ; you gave me a lot of information 13:07 djcoin: I got to go now 13:08 stamourv: See you later! 13:08 djcoin: Cheers ! And thanks again ! 13:08 djcoin: :) 13:08 (quit) djcoin: Quit: WeeChat 0.3.2 13:08 Shambles_: djcoin: They haven't kicked me out, and I'm a obnoxious noob. They'll probably treat you okay. ;) 13:12 (quit) Demosthenes: Read error: Connection reset by peer 13:28 (quit) wtetzner: Read error: Connection reset by peer 13:28 (join) jeapostrophe 13:28 (quit) jeapostrophe: Changing host 13:28 (join) jeapostrophe 13:31 (join) wtetzner 13:33 (join) neilv 13:36 (quit) veer: Remote host closed the connection 13:45 (quit) sstrickl: Quit: sstrickl 13:52 (quit) antithesis: Quit: antithesis 13:56 (join) antithesis 14:04 (quit) anRch: Quit: anRch 14:19 neilv: ok, i was smoking crack late last night about syntax locations 14:23 samth: neilv: not good for your teeth 14:23 neilv: it's better than the meth 14:26 (join) nilyaK 14:59 adu: zomg 15:01 (quit) jonrafkind: Ping timeout: 246 seconds 15:17 (join) jonrafkind 15:36 (quit) nilyaK: Quit: Sleep omg! 15:44 (join) RacketCommitBot 15:44 RacketCommitBot: [racket] plt pushed 1 new commit to master: http://git.io/xlsPaQ 15:44 RacketCommitBot: [racket/master] Fixes PR12767 - Jay McCarthy 15:44 (part) RacketCommitBot 15:45 jeapostrophe: samth: any further comments about the web server thread? 15:45 samth: jeapostrophe: i was meaning to write a response 15:45 samth: in short, i understand that you can do an eval 15:45 samth: and that's all that ruby/python/etc are doing 15:46 samth: but the web server makes it easy to link everything at compile time 15:46 samth: and doesn't help if you want the more dynamic behavior 15:46 samth: so i think you're underestimating the importance of defaults 15:48 (quit) ssbr_: Ping timeout: 260 seconds 15:48 jeapostrophe: I'm not sure I understand what you think the right thing to do is... include-template-dynamically (or rather, include-template-statically)? 15:49 samth: jeapostrophe: something like that 15:49 samth: which identifier is which doesn't really matter, i think 15:49 samth: but also making it easy to dynamically re-update servlets 15:50 jeapostrophe: what is easier than browsing to a URL? 15:51 samth: jeapostrophe: no, i mean re-updating without doing anything 15:51 samth: as in, on every visit, re-eval the servlet 15:51 jeapostrophe: that would make every continuation not work 15:52 samth: which you might not want in production, but would be useful if the developer isn't using templates that could be included dynamically 15:52 samth: jeapostrophe: when i was developing the little github thing i wrote, i would have been happy for that trade 15:53 jeapostrophe: how can you test it at all if the continuations don't work? i don't understand 15:54 jeapostrophe: or at least, every old continuation would refer to some older version 15:54 jeapostrophe: you say, "it's fine"? 16:01 samth: no, what i mean is that i try it, it doesn't do the right thing, i change the file, and then i want everything to be updated 16:01 samth: gtg 16:02 jeapostrophe: ttyl 16:17 (quit) jonrafkind: Ping timeout: 252 seconds 16:29 (quit) antithesis: Quit: antithesis 16:35 (join) jonrafkind 16:35 (quit) jonrafkind: Changing host 16:35 (join) jonrafkind 16:36 Cryovat: Hmm 16:36 Cryovat: Stumbled across an inconsistency 16:36 Cryovat: - can be used as an unary function, fl- can't 16:38 Shambles_: asumu: Assuming you're interested, it does look like someone tried to implement restarts for Scheme. The SRFI-12 part of this page includes the withdrawn SRFI, a implementation, and some discussion. http://okmij.org/ftp/Scheme/util.html 16:38 Shambles_: asumu: It's just they're calling the them "conditions" that are "continuable", as opposed to a "restart". 16:39 Shambles_: Looks like Chicken scheme ships with this too. 16:42 asumu: Oh, I remember reading about that SRFI. Too bad it was withdrawn. 16:43 neilv: iirc, r6rs people were submitting some srfis with intention of withdrawing them, to elicit discussion for r6rs. i don't know whether this was one of them 16:44 neilv: post-r6rs, rnrs moved to community working groups 16:45 neilv: i think the working groups at one point would have benefitted from getting everyone in a room with wiffle bats, and locking the doors until consensus was reached among the surviving persons 16:48 Cryovat: I assume you're positive for r7rs then ;) 16:48 Cryovat: Or rather, for the process 16:49 neilv: i use racket exclusively now. i wish rnrs all the best 16:51 Cryovat: Hehe 16:51 neilv: i wonder what's the most efficient way to copy N characters (not bytes) between ports 16:56 neilv: probably just "read-string" or "read-string!" in a loop with a limit. not sure what's an efficient buffer size if we're doing characters. for bytes, i'd just pick a block size that's likely to be used by the device 16:57 Cryovat: Tried benchmarking? 16:57 neilv: or i could do read-bytes-avail! or similar in a loop, and to the character decoding on those buffers 16:57 (quit) mye: Ping timeout: 244 seconds 17:00 Shambles_: asumu: Looks like someone has done a port to Racket, but hasn't bundled it separately? http://planet.plt-scheme.org/package-source/lizorkin/ssax.plt/2/0/srfi-12.ss 17:00 rudybot: http://tinyurl.com/7xqurkw 17:01 neilv: i'll just do "read-string!" in a loop, and punish people who are using multibyte characters 17:02 (join) dzhus 17:03 neilv: Shambles_: the okmij.org site is oleg kiselyov. kirill livossky and dmitry lizorkin packaged (and extended) oleg's ssax-related stuff for various scheme implementations. so that planet package is probably mostly the code from okmij 17:04 neilv: er, typo: kirill lisovsky 17:04 Shambles_: neilv: The implementation on okmij.org only works on Bigloo and Gambit, but the one on PLaneT has Racket-specific code. 17:04 asumu: Shambles_: Racket's R6RS compatibility language supporst continuable exceptions. 17:04 asumu: As they are standardized in R6RS. 17:04 asumu: *supports 17:04 asumu: I don't see a built-in way to do that in the core Racket exception system, but I could be wrong. 17:05 Shambles_: asumu: Can you point me at the right place in the documentation? I'm not trying to be a pain. I'm just not finding it anywhere from searching. 17:07 asumu: Shambles_: http://pre.racket-lang.org/docs/html/r6rs-lib-std/r6rs-lib-Z-H-8.html#node_idx_364 17:07 rudybot: http://tinyurl.com/7uvprou 17:09 Shambles_: asumu: Thanks. So I'm guessing there's nothing equivalent to raise-continuable in Racket? That seems to be what I'm looking for. 17:09 asumu: (my best guess as to why Racket doesn't use R6RS exceptions: it was added in 1996 long before R6RS) 17:10 asumu: I don't think there is. You can implement it on top of the exception system probably. 17:10 Cryovat: When did you get involved? 17:10 asumu: Me? 2 years ago. 17:14 (quit) dented42: Quit: Computer has gone to sleep. 17:15 Shambles_: asumu: Okay. Thank you. It looks like that one off PLaneT might let me get used to using them. Maybe there's some hope of that being added to the supported SRFI's for Racket? There's a pretty big collection already, and it's already written. 17:17 asumu: rudybot: (struct exn:cont (val cont)) 17:17 rudybot: asumu: your sandbox is ready 17:17 rudybot: asumu: Done. 17:17 asumu: (define (raise-continuable v) (call-with-composable-continuation (lambda (k) (raise (exn:cont v k))))) 17:17 asumu: rudybot: (define (raise-continuable v) (call-with-composable-continuation (lambda (k) (raise (exn:cont v k))))) 17:17 rudybot: asumu: Done. 17:17 asumu: rudybot: (with-handlers ([exn:cont? (lambda (e) ((exn:cont-cont e) 3))]) (+ 1 (raise-continuable 5))) 17:17 rudybot: asumu: ; Value: 4 17:17 asumu: Rudimentary continuable exceptions. 17:18 asumu: (I think) 17:21 Shambles_: asumu: Thanks. I'll paste that into my big wad of notes. I just found another thing on syntax-parse to read. Hopefully it'll help the macro system sink in better. Then I should probably get to trying to straighten up my notes, and maybe post something to that mailing list. 17:21 Cryovat: The macro system is still a big mystery to me 17:21 (join) anRch 17:22 Cryovat: I've had success with define-syntax, but the more advanced stuff boggles me 17:23 Shambles_: Well, I understand why syntax-parse exists now, and its basic functioning, but I'm finding reading it sort of hard still. The fact it seems to work a lot like the pattern matching functionality, which I understand a lot better, helps, but I still can't usually figure out what a macro does by looking at its definition yet. 17:25 Shambles_: To be honest, I think more tutorials are needed. I'd consider writing one, but I don't have a website to put it on, and I'm afraid I'd do more harm than good at this point. 17:26 Cryovat: Hehe 17:27 (quit) jesyspa: Ping timeout: 252 seconds 17:27 neilv: if you want to learn about syntax-objects, try using "syntax-case" before "syntax-parse". "syntax-parse" is more complicated, and you'll get lost if you don't understand syntax-objects 17:28 Shambles_: neilv: Aren't they basically the same thing, other than syntax-case doesn't work with syntax objects, so doesn't automatically generate good error messages? 17:29 (join) jesyspa 17:29 neilv: syntax-parse has a lot more features and concepts to distract you from learning what a syntax object is and how to deal with it manually when you have to 17:30 neilv: so, if you jump right to syntax-parse, you'll either be overwhelmed with the features, or you'll managed to use the features but are more likely to miss learning some fundamentals 17:30 neilv: imho 17:30 Cryovat: The general obstacle I feel I run into when I read about macros or continuations in the docs is that it feels very theoretical 17:31 neilv: well, for macros, you just have to start simple and build up, doing lots of exercises, not lots of reading 17:31 Cryovat: Not quite as bad as a research paper, but certainly in a less penetrable way than the rest 17:31 Shambles_: neilv: I'm just reluctant to learn something knowing I'm going to 'throw it away'. The documentation on these is pretty daunting, and it seems to be written more from a 'specification' than a 'user' point of view. What I really need is to see stuff expanding bit by bit, with explanations as to why, and a bunch of practical examples. 17:31 neilv: for continuations, you'll just hurt your brain 17:31 Shambles_: neilv: That's why I tried to start with syntax-parse, since at least after I get through it it'll be what I want to use. 17:32 jonrafkind: if you truly understood syntax objects and how expansion works then syntax-case will take you a few seconds to understand 17:32 neilv: shambles: so type an example into drracket, and hit the macro debugger button, and hit the step button repeatedly 17:33 Shambles_: neilv: After I got past some problems with prompts (one involving a bug in Racket), continuations didn't seem that bad to me. I kind of like them, and am looking forward to having that tool to use from here on. 17:33 jonrafkind: if you approach syntax-case and syntax-parse as "systems" that each have their own quirks then you will permanently at a loss 17:33 neilv: well,if you don't understand it, but you think you know how to learn it, you're free to ignore the people who do udnerstand it and are suggesting how best to learn it :) 17:34 jonrafkind: imo if you are at the point where you need to use syntax-case or syntax-parse then you had better understand hygiene because likely you are going to need it soon 17:34 jonrafkind: neilv, do you read my emails to the list about macros? 17:35 neilv: i skim the list some days, and go back and read things later 17:35 jonrafkind: im just wondering if its helpful to anyone else 17:35 jonrafkind: or if macro people think its old hat 17:35 Shambles_: neilv: Yes, I'm using the macro stepper (a lot). So far the closest thing to something I'd actually want to use is in the syntax-case part of the guide. syntax-rules looked too restrictive to be useful. I think I could just get by with functions with variable arity (dodging the need to define lots of variables or do other things functions can't normally do) and whatnot rather than resorting to that. 17:35 jonrafkind: to me the rules of the macro system are at least as complex as c++.. 17:36 Shambles_: neilv: It took me a while to understand some of the recursive expanding macros in the guide despite that, and I haven't felt that they helped me understand the dissertation-culpepper.pdf any more than figuring out "a b c ..." should be read as "a" "b" "c ..." (i.e. the dotdotdot goes with the last variable), which I figured out from remembering the matching section. 17:37 Shambles_: neilv: The guide only covers the 'obsolete' macro systems. Nothing on syntax-parse, but there is a separate section on that which I'm going through. 17:37 neilv: you sure you don't want to do some practical coding before going and reading dissertations? 17:38 Shambles_: neilv: Pretty sure. I don't have anything I really have to get written right now, and I don't feel comfortable working with a system I don't feel at least remotely acquainted with. Otherwise I end up, basically, 'writing Fortran in _____', or rewriting parts of the standard library, badly. 17:38 neilv: some people, we can't get them to take a step back and go through htdp before doing practical coding. other people insist on reading everything up to and including dissertations before they'll get much familiarity coding 17:39 Cryovat: Personally, I skipped HTDP 17:39 Cryovat: My rationale for that was that I have a day job and want to achieve something in my free time 17:40 Shambles_: neilv: Well, I'm actually pretty darn good with Python, and despite hating it, I'm competent with C++, and in the past was actually very good with C. I don't think there's going to be much for me to learn outside the stuff that doesn't exist in the languages I already know. 17:40 Cryovat: HTDP looks solid, but going through that first in a proper way would probably take weeks 17:40 neilv: that's fine. not everyone needs to work through htdp. but some people who do, don't, and then they say "explain recursion to me" 17:40 Shambles_: neilv: I have to do the reading to figure out where you guys "hid my list comprehensions" or "hid the generators". I know how to use that stuff, but didn't know how to use them in Racket (especially generators, it's only mentioned in the reference). 17:41 Shambles_: neilv: The stuff that's not "just Python with parentheses" takes a lot longer to sink in. 17:41 neilv: ok, good luck. i am neglecting my emacs window for too long 17:41 (quit) neilv: Quit: Leaving 17:42 Shambles_: neilv: I understand recursion. It's one thing to be comfortable with stack frames (or the lack thereof in the tail call optimization case) and a function calling itself directly or indirectly, and quite another to be staring down the barrel of something that executes at compile time and may take multiple paths, and end up referring to itself in the process, producing code as it goes. :P 17:45 Cryovat: He left :( 17:45 Cryovat: It's odd 17:46 Cryovat: When I started CS, people told me that recursion and certain other things (linked lists, for one) would be really hard 17:46 Shambles_: Cryovat: I guess I have that effect on people? :P 17:46 Cryovat: But always found it natural 17:46 Cryovat: I see that some people at work from a non-code background seem to have trouble with it though 17:47 Shambles_: Cryovat: I think I got a alien brain (or something is just wrong with it). I had trouble with some things most people do. I remember pointers being very hard at first, mostly because nobody ever just got to the point and said "they're used to implement data structures" and then showed me "you do that like this" instead of using lots of abstract explanations. 17:48 Shambles_: Cryovat: Continuations don't seem so bad, mostly because I understand stack frames. 17:48 Mungojelly: Each of these ideas are simple on their own. Simple and incredibly weird. Sometimes something slips easily into your mind, and sometimes it won't go. It's pretty mysterious. Trying really hard and then giving up and going to sleep has worked for me a lot of times. 17:48 Shambles_: Cryovat: Recursion wasn't so bad either. I remember having it 'click' really hard when seeing it used to do the maze solving algorithm. 17:50 Shambles_: Cryovat: My main problems have to do with predicting what something will do after it's run a while. I really hate things like monkey patching, for example. You can't /see/ in the code, anything like what is supposed to happen. My trouble with the gradually expanding macros is partly that, not that the macros are bad like monkey patching is (to me at least). 17:51 Cryovat: Ah yeah, I understand that 17:51 Mungojelly: Racket's contracts only mediate between modules? 17:51 Cryovat: When beginning Racket, there's a lot of magic 17:51 Mungojelly: Yay, magic, that's what I'm here for! 17:52 Shambles_: Cryovat: That, and, admittedly, I seem to be particularly bad at 'scalar' math, while being pretty good at everything else. Calculus gave me hell. On the other hand boolean logic, Prolog, graph theory, and (after it clicked) algebra was fun. Geometry and trig was fun because I could at least see if I got it wrong (if it visually made sense). 17:52 Cryovat: The same applies to me 17:53 Cryovat: It's odd, I could barely claw my way through calculus 17:53 Shambles_: Mungojelly: Actually you can use contracts internally with define/contract (it's in the Reference), but for some reason the Guide only shows how to do it at module boundaries. I had the exact same question 17:53 Cryovat: Discrete math was a pain too 17:53 Cryovat: But Prolog was just fun 17:54 Mungojelly: At module boundaries makes plenty of sense, my only problem with it is that it breaks how I was playing with DrRacket. Ooh, it can have tabs, OK. So I guess I can have a tab with a module and a tab with a client, somehow.. 17:54 Shambles_: Mungojelly: One of the weirder features of contracts is you can stick them on variables. I've never seen that done before. 17:54 (join) jrslepak 17:54 adu: Shambles_: "stick"? 17:54 Mungojelly: Variables... what are those? ;) 17:55 (quit) ivan`: Ping timeout: 248 seconds 17:55 Shambles_: adu: I'm used to contracts basically 'inserting code' at the start and end of functions and methods, or at certain points in loops. There's normally no way to make them be checked any time a variable is assigned. What I described is how they work in Eiffel (their birthplace), Cobra, and the Python addon. 17:56 Cryovat: Ah 17:56 (join) ivan` 17:56 Cryovat: You don't use Typed Racket, do you? 17:56 Mungojelly: I have a question! There's some introspection inside Racket, it'll tell you what symbols are bound and stuff, but is it self-aware enough that it's worth poking around it from inside to figure it out? That's how I learned Squeak Smalltalk and it was tons of fun. :D 17:57 Shambles_: Cryovat: Not normally. I'm comfortable with dynamic type checking. I couldn't have lived with Python all this time otherwise. I can see the benefit (performance) to me using it eventually. I do plan on using the hell out of contracts. 17:57 jonrafkind: Mungojelly, the internals of drracket are not for the faint of heart 17:57 Mungojelly: I don't understand at all when it's appropriate to use contracts? 17:57 Cryovat: II'm a big fan of the type system in Typed Racket 17:57 Cryovat: The only problem is that I have a knack for stumbling into obscure use cases 17:58 (quit) adu: Read error: Connection reset by peer 17:59 Shambles_: Mungojelly: Some people will disagree with this. Here's my take on various common (don't need a PhD to use it) bug killing methods. Static type checking is handy for performance, telling you if you typoed a variable name (rather than creating a new variable with the wrong name), making sure something you passed had all the right methods (so the caller doesn't bomb out when trying to use it), and for performance. 17:59 (join) adu 17:59 Shambles_: Mungojelly: Unit testing is for trying to 'perturb' the code. See if you can make it screw up after making some changes. 18:00 Shambles_: Mungojelly: Contracts are for 'trapping' bugs at their point of origin. This keeps you from wandering around in the debugger trying to figure out how your code went wrong when a unit test fails, but more importantly, it captures bugs that your unit tests *didn't*. 18:00 Cryovat: That's one of the big benefits of Typed Racket imo 18:01 Mungojelly: OK, that all makes sense to me except the part about contracts, which makes sense as I'm just starting with contracts. :) 18:01 Cryovat: It has captured most of the bugs for me so far before they happened at runtime 18:03 Shambles_: Cryovat: Some people tell me that about statically type checked languages. From having started with C, and then gotten more familiar than I would like with C++, my experience has been types haven't saved me from many agonizing debugging sessions. 18:04 Cryovat: There will always be pain 18:04 Mungojelly: OK so like a contract runs every single time, so it's like a mini unit test that's always in place, doing a super-quick check all the time that the piece did what it was supposed to do?! 18:04 Shambles_: Cryovat: Now supposedly if you define lots and lots of types, basically one for each 'range' of interest (positive numbers, negative numbers, non-zero...), and design your programs so they 'construct' things only of the right type, you can shove a lot of the checking into the type system. Maybe it's because I only use types to placate the code generator (usually for assembly) that I don't get more out of them. 18:05 Cryovat: But whenever I jump from .NET to Javascript at work, debugging gets significantly more annoying 18:05 asumu: Mungojelly: Contracts are an agreement between two pieces of code. When a value goes between the pieces, the contract is checked. The "pieces" can be modules, sections of code inside your module, or within class hierarchies. 18:05 Cryovat: Yeah, that has been one of the major ways I've been using the TR type system 18:05 Shambles_: Mungojelly: Yep, that's exactly what they do. And when it fails you usually get a core dump, or a debugger opens for you, showing exactly where the program messed up. The more fine grained your contracts the less code you have to look at to find out where the state got corrupt. This basically makes me want to spray them all over. 18:06 asumu: (or functions, of course) 18:06 Shambles_: Mungojelly: It also gets you in the habit of thinking about exactly what each part of your program should do, since you have to specify the valid input and output of everything. 18:07 Mungojelly: Yeah, it seems like a good habit generator, that's one of the main benefits I've found to unit testing, by the time you've thought about the function that clearly in terms of input & output & edge cases, you've successfully thought clearly about the function. :D 18:07 Cryovat: I haven't been able to get into unit testing myself :( 18:08 Shambles_: A lot of people seem to think they can get by with only one or the other. If I had to pick one, it'd be contracts, since that will catch bugs testing wouldn't have, but I'd rather have both. 18:08 Mungojelly: Plus I can see how contracts would make the code more readable, because it specifies things that the programmer has in their heads. 18:08 Cryovat: For non-trivial code, it always feels like it blows up the number of mock classes you have to write 18:09 Shambles_: The dirty secret nobody seems to want to admit to is, deep down, most of us have no @#$% idea how to write a given program. We certainly don't start out with a collection of axioms and form a constructive proof. 18:09 Mungojelly: I think of a non-unit-tested piece of code as a house of cards. Nothing wrong with a house of cards! It just depends on if you're designing for a place where you're expecting any mild breezes or anything. ;) 18:09 Shambles_: Instead, we draw some sketches of how data should move through the system. Then we try to write some pseudocode that looks like a English explanation of how to solve the problem by hand. Then we try writing the code to match the pseudocode... 18:10 Mungojelly: I'm not afraid to admit I have no idea how to program. But I'm not collecting a paycheck doing it, yet. That makes it like admitting fraud, almost. ;) 18:10 Shambles_: The problem with all that is it doesn't /really/ work well with the test-first and "write your specs first" methodology, because you don't *know* what your spec or tests should be (or even your API) at first. 18:10 (quit) netrino: Quit: Ave! 18:11 (quit) jeapostrophe: Ping timeout: 244 seconds 18:11 Shambles_: So I think what people really do, that have decent quality code, is just squeeze something out as I explained. Then stare at it and think about how they might be able to break it. Write the unit test for that. Keep thinking of ways until you can't think of any more ways to break it. Then go in and fix your code if any of that succeeded at breaking it. 18:12 Cryovat: I daresay that there's a lot of code that doesn't lend itself easily to unit testing as well 18:12 Shambles_: Once all that's done, then write your contracts, since the unit tests will give you real good ideas about what aught to be, and aught not be, valid input. 18:12 (join) neilv 18:12 Shambles_: Oh yes, that's another thing. 18:12 Shambles_: Never ever hard code input in anything computational. Always make sure you can 'swap out' the I/O for some functions that don't do anything. 18:13 Cryovat: A significant part of the programs I write commercially are GUI forms with editors bound to datasources 18:13 (join) dented42 18:13 Cryovat: Unit tests don't make sense in that kind of situation 18:13 Shambles_: If you're good, and use the Model<-->Controller<-->View design (I forget what they call this, but can look it up) all that doesn't get automatically tested is the actual GUI display code. 18:14 Mungojelly: I think in general most of the GUI layer should be abstracted to something that users understand and have control over. 18:15 Shambles_: http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter 18:15 Mungojelly: We should be handing the end-user just back-ends, and everybody and their grandma should know how to make their own button that triggers something. 18:16 Shambles_: Well, the idea in model-view-presenter is the model and presenter (controller) should not be dependent on the view. Heck, if you do it this way, you can use the same controller as the GUI for a scripting interface, to do the validation. The view should just be whatever your GUI designer barfs out. Some of them are getting to the point of where the GUI code is just 'data' (e.g. QtDesigner spits out XML). 18:18 (join) dnolen 18:26 (join) sizz_ 18:27 (quit) peeeep: Ping timeout: 245 seconds 18:35 (quit) anRch: Quit: anRch 18:43 neilv: http://paste.lisp.org/display/129901 18:46 Cryovat blinks 18:50 neilv: just got first test case working 18:50 neilv: it's taking input "(aaa bbb ccc ddd eee)" from a port, performing programmatic edits, and writing "(xxx aaa bbb seeseesee eee)" to the output port 18:59 jonrafkind: isn't (require foo) supposed to look for foo/main.rkt first and then foo.rkt second? 19:03 (quit) adu: Quit: adu 19:03 jonrafkind: oh only if tehres no / in it 19:13 (join) jeapostrophe 19:13 (quit) jeapostrophe: Changing host 19:13 (join) jeapostrophe 19:17 (quit) masm: Quit: Leaving. 19:19 (quit) jeapostrophe: Ping timeout: 260 seconds 19:22 (quit) jonrafkind: Ping timeout: 260 seconds 19:29 (quit) dzhus: Ping timeout: 246 seconds 19:36 (join) acarrico 19:39 (quit) jesyspa: Quit: leaving 19:40 (join) jonrafkind 19:40 (quit) jonrafkind: Changing host 19:40 (join) jonrafkind 19:46 (quit) dnolen: Ping timeout: 244 seconds 19:46 (quit) cdidd: Remote host closed the connection 19:49 (join) kvda 20:03 asumu: Oh huh, I barely even noticed that IPv6 day happened. 20:07 ashish: IPv6 day is what happens while you're busy traversing your IPv4 NATs :p 20:13 (join) jyc 20:14 asumu: Yeah, true. My IPv6 connection is just a 6to4 tunnel. 20:14 (quit) jrslepak_neu: Ping timeout: 265 seconds 20:17 (join) jrslepak_neu 20:21 (join) nilyaK 20:43 (join) jeapostrophe 20:43 (quit) jeapostrophe: Changing host 20:43 (join) jeapostrophe 20:45 (quit) jonrafkind: Ping timeout: 252 seconds 20:49 Shambles_: Okay, I know this is a dumb question, but I can't seem to get my attempts to work, and can't seem to find an example. All the macro tutorials use templates exclusively. How do I actually force something to execute at compile time, instead of just fill out a template that gets executed at run time? 20:50 Shambles_: 'obvious' solutions like removing the template quote tells me that I can't use pattern variables outside a template. 20:53 neilv: can quickly paste an example that doesn't work? perhaps using http://paste.lisp.org/new/racket 20:56 Shambles_: neilv: This will be embarrassingly stupid, and impractical, but I've been trying to just add two numbers and get some evidence it was done at compile time. 20:57 (quit) jeapostrophe: Ping timeout: 248 seconds 20:57 Shambles_: http://paste.lisp.org/display/129903 20:58 Shambles_: I've tried removing the #' quote. I've tried different things in the place where the macro has been called to 'see' the 3 instead of the function. Nothing has worked. 21:01 neilv: http://paste.lisp.org/display/129903#1 21:02 neilv: that doesn't do error-checking, but you get the idea 21:03 Shambles_: neilv: Yeah, I know how to add the error checking. I eventually couldn't get anything hard to work so decided to go with the simplest case. Thanks for the example. I hadn't thought of trying to quote the variables individually. 21:04 neilv: like i said earlier, i think you'll probably find these things easier to figure out if you use syntax-case first, rather than jump into syntax-parse and all the other things that are in the documentation for it 21:08 neilv: also, i am on a mission to get people to use all-uppercase for pattern variables. it makes code more readable, avoids some errors, and makes explaining templates and pattern variables to newbies easier 21:11 asumu: neilv: if you write a macro tutorial using that style, I bet you would get converts. ;) 21:12 asumu: (seriously though, maybe we should have a doc-fest at RacketCon to write tutorials) 21:12 asumu: (since we are lacking in this department) 21:12 (join) yoklov 21:13 Shambles_: neilv: The syntax classes thing isn't confusing me, nor is the templates. In your example what is confusing me is the syntax-e and quasisyntax/loc thing, but that's because it's not been mentioned in the 'how to use' documentation I've read so far. 21:15 Shambles_: Filling out templates is all well and good, and I guess if all you want to do is define more variables that's okay, but it doesn't seem terribly useful. I've gotten by without macros in other languages, and would just pass things like lists and arrays and dictionaries if I need 'more' arguments at times. 21:15 Shambles_: What I want to know how to do is to take in some s-expressions, do some processing, and insert some code where they came from. 21:18 neilv: asumu: i have a book in the early stages. it needs me to finish things like mcfly first 21:23 neilv: here is how i don't want my book to be received. Book: "First, it is important that you learn X..." Reader: "I know what I want to do, and it's not X, I just don't know how to do it, but I'm sure it's not X, because I was told so in a vision I had of the future." 21:23 Shambles_: I take it this is a correct translation to syntax-parse (without error checking) http://paste.lisp.org/display/129904 21:32 (quit) mceier: Quit: leaving 21:33 Shambles_: As an aside, I /have/ read the guide on syntax-case. It's rather short, and obviously didn't help me get through this. 21:33 Shambles_: I also read the syntax-rules section right before it. 21:35 Shambles_: My impression has been "syntax-parse is syntax case, with syntax classes for better, mostly automatically provided, error reporting". They seem to literally be the same other than that. Maybe the reference reveals more features, but even the dissertation didn't. 21:37 asumu: It's not just error reporting. It's to reduce the tedium of doing multiple levels of pattern matching and checking to make sure your input has the right shape. 21:37 asumu: Complicated syntax-case macros effectively re-implement a parser for a specific grammar. 21:38 asumu: So syntax-parse just gives you a parser. 21:39 Shambles_: asumu: I suppose that's true. Maybe the pattern matching is fancier than syntax-case. It didn't seem to /do/ much other than the improved error reporting, which was achieved by that progress tracking algorithm and syntax classes, though. 21:39 (quit) neilv: Quit: Leaving 21:44 Shambles_: I don't feel bad about not knowing about syntax-e. It's mentioned that it's used internally in the syntax-case documentation, but there's no example of how to evaluate anything at compile time, except for inserting some error checking code that is done with #:fail-when in syntax-parse. A search of the documentation shows it's not mentioned anywhere else but the reference. 21:45 Shambles_: And the reference is sorely lacking in example code. It mostly lists functions by category, with their input and output types, and /very/ brief descriptions. There's no "you might use this for" or examples for most. 22:16 Shambles_: Why is quasisyntax/loc used? And is there any reason to have used that rather than plain quasisyntax (seems to be done with #` most of the time)? I've figured out what syntax-e does for practical purposes. 22:23 (join) peeeep 22:24 (join) hash_table 22:24 (join) rodolfo 22:25 (join) getpwnam 22:26 rodolfo: hi all, I am writing a small experiment in which I want to store a continuation to an SQLite database. I tried using serialize from racket/serialize but it didn't work. Any advice? 22:27 (join) jonathansizz 22:28 rodolfo: I see the webserver has a "call-with-serializable-current-continuation" so I guess there is a way to serialize it... 22:29 (join) otterdam 22:34 (quit) dented42: Ping timeout: 244 seconds 22:46 (join) jonrafkind 22:46 (quit) jonrafkind: Changing host 22:46 (join) jonrafkind 23:00 (quit) rudybot: Remote host closed the connection 23:00 (join) rudybot 23:13 (join) dented42 23:16 (quit) cataska: Quit: leaving 23:19 (quit) jyc: Read error: Connection reset by peer 23:32 (quit) nilyaK: Read error: Connection reset by peer 23:40 (join) mmalorni 23:42 (join) clabrie 23:43 (join) cataska