00:01 (quit) drumond19: Remote host closed the connection 00:02 mithos28: The problem is that dates have not been announced, and travel is more expensive on shorter notice 00:04 Shambles_: Where are they held at? 00:04 mithos28: Last one was at northeastern, and I think the next will be as well. Or that is what I remember hearing 00:07 Shambles_: That's a long ways from me. I'm glad it exists. Maybe at least the talks will be put up as videos or something. 00:07 Shambles_: I've never heard of a language with a convention before, but maybe I just haven't gone looking. 00:07 mithos28: I wouldn't count on the videos being timely 00:08 mithos28: haskell has hackathons all the time 00:08 mithos28: and other languages probably have local meetups as well 00:08 asumu: Clojure has its thing now. Also RubyConf & PyCon. 00:09 (quit) jao: Ping timeout: 260 seconds 00:12 (quit) jacius: Remote host closed the connection 00:13 neilv: but racket conferences tend to have the wildest suite parties 00:13 offby1: well, poo. 00:13 offby1: And here I didn't attend last year's. 00:14 (join) Kaylin 00:14 Shambles_: Any reason in particular the videos won't be timely? A lot of these talks are interesting. 00:15 jonrafkind: im sure videos will be done properly this year.. 00:20 Shambles_: Is PLT Inc. somehow related to Northeastern University? 00:21 jonrafkind: well, only in that a good portion of the members of PLT Inc. work at northeastern 00:21 Shambles_: Somehow I got the impression that PLT Scheme was another school-based Scheme a lot like MIT, but I'm not sure where I got that idea. 00:21 jonrafkind: if theres anything about corporate status or whatever, i have no idea 00:21 (quit) mithos28: Remote host closed the connection 00:22 (join) mithos28 00:22 jonrafkind: well its true a major use of plt scheme (racket) is in education 00:22 jonrafkind: and thats where it started basically, as a teaching tool 00:22 Shambles_: Well, that's probably true, but not what I meant. I more meant "it comes from a school", sort of like MIT Scheme, and, at least in the past, BSD Unix. 00:23 jonrafkind: well thats true, it was started by researchers and continues to be developed by researchers 00:23 neilv: plt inc is actually a shell company of the illuminati 00:23 jonrafkind: its a research level tool that has industry usage 00:24 Shambles_: I'm not sure where I thought the PLT came from. Maybe Philadelphia Lake Territory or Phase Linear Transmogrifier or something. 00:24 jonrafkind: i think its now considered not to stand for anything 00:24 Kaylin declares it means pretty large toolkit from now on. 00:25 mithos28: Programming language theory 00:25 neilv: does not stand for anything? then it's unprincipled? 00:25 Shambles_: I like Pretty Large Toolkit. ;) 00:25 neilv: (technology) 00:28 (quit) Kaylin: Quit: Leaving. 00:31 (quit) mye_: Read error: Connection reset by peer 00:32 Shambles_: If Racket gets a mascot, like the Odie Python snake, I think it aught to be a dog, like the old Victrola logo. The lambda is about the right shape. :P http://en.wikipedia.org/wiki/File:VictorTalkingLogo.jpg 00:34 (join) dented42 00:35 offby1: I think it should be a psychedelic eli with frizzy hair 00:35 offby1: and lighting bolts 00:36 Shambles_: In a spandex superhero outfit with the PLT logo on the chest? 00:37 offby1: well, I was thinking more lit from below, like a crazy mad scientist 00:37 offby1: Gene Wilder in "Young Frankenstein", e.g. 00:37 Shambles_: Hee. 00:38 offby1: crossed with Tom & Ray Magliozzi 00:38 Shambles_: Not familiar with those two. 00:38 Shambles_: I do know Young Frankenstein though. I watch it most Halloweens. 00:39 offby1: They're the hosts of "Car Talk", a beloved NPR call-in show which unfortunately is about to end. 00:40 Shambles_: I take it it's not just dry talking about cars. 00:40 neilv: at the racket con in boston, you can take a group of people on the red line across the river to confront click and clack at their garage 00:41 offby1: Shambles_: it's somewhat more on-topic than #emacs. 00:42 Shambles_: offby1: So they're /allowed/ to talk about cars. ;) 00:42 offby1: neilv: a demonstration! 00:42 offby1: Shambles_: when they _do_ talk about cars (in between the dumb jokes) they're damned sharp 00:42 offby1: Shambles_: are you a USAian? 00:43 Shambles_: Shambles_: Yes, but I don't listen to NPR, or any news if I can help it. It's bad for my nerves. 00:43 offby1: it's a cultural obligation for you to at least know of them, and ideally to recognize their voices. Hell, even I (sometimes) know which teams are playing in the Super Bowl. 00:44 Shambles_: I have to admit I never know who is playing the Super Bowl. 00:44 offby1: (You are _not_ required to be able to tell Tom's voice from Ray's.) 00:44 Shambles_: Of course I also don't own a TV, so I'm rather odd for a USAian. 00:44 offby1: yes, but not so odd for an IRCian. 00:45 offby1: I'd _probably_ own a TV if I were single, but I can't swear to it. (As it is, I mostly just watch whatever Mrs Offby1 watches) 00:45 offby1: where by "watch", I mean: give the TV about 10% of my attention, and IRC the other 90% 00:46 Shambles_: offby1: I guess I should say "there is no TV in my dwelling". :P 00:46 offby1: sure 00:49 Shambles_: I hadn't been very active on IRC either until finding this room. I only came here to try to get through the first few painful weeks/months of actually learning (not just writing Fortran in) a new language. I'm used to getting my ears boxed if I breath too loud on most channels. 00:51 neilv: #racket doesn't have a huge presence 00:52 neilv: it is a few people, plus eli, plus people lurker and whispering in their secret backchannels 00:52 neilv: lurking 00:52 offby1 boxes Shambles_' ears 00:52 offby1: whippersnapper 00:53 offby1: interesting how neilv drew a distinction between "people" and "eli" 00:53 offby1: RELEASE THE ELI 00:53 neilv: people sleep 00:54 offby1: so I hear 00:54 (quit) dented42: Quit: Computer has gone to sleep. 00:54 neilv: and computers too 00:56 Shambles_ bleeds all over offby1's shoes to get even. :P 00:56 Shambles_: So, basically not having many people keeps the channel from getting too unpleasant? :P 00:58 (join) Kaylin 01:04 (quit) veer: Read error: Connection reset by peer 01:04 (join) mithos28_ 01:04 (quit) mithos28_: Remote host closed the connection 01:05 (quit) mithos28: Read error: Connection reset by peer 01:05 (join) mithos28_ 01:07 neilv: i'm about to release a new version of the scgi library, and was testing it. performance is pretty good 01:08 Shambles_: Hmm. I wonder if PLaneT runs on Racket's web server thing. 01:09 neilv: http://paste.lisp.org/display/129976 01:09 neilv: there was one freakish 3-second request in there. must've been a big gc cycle 01:09 neilv: or maybe an initial request. i'm not sure when the jit does its thing 01:10 neilv: median request time during 10 simultaneous requests was 2 ms 01:11 neilv: this is with apache, the racket scgi server, and ab all running on my laptop here 01:12 Shambles_: Should be nice. 01:12 mithos28_: that is a very steep curve above 99% 01:12 Shambles_: I'd rather use Racket for working with web pages than PHP or Perl. 01:13 mithos28_: theres always python 01:13 mithos28_: as an alternative 01:13 Shambles_: Yes, I like Python quite a lot. 01:13 mithos28_: I dislike it 01:13 neilv: i will eventually do something about avoiding gc delays 01:14 Shambles_: I'll probably end up not using it much eventually, but I still think it has a lot of good features. I'd prefer it over a Lisp to teach new programmers, if for no other reason than it tends to be rather painful to use bad practices in Python. At the very least they'll have to indent their code properly. :P 01:14 Shambles_: mithos28_: Any reason in particular? 01:15 mithos28_: what a false value is, is annoying 01:15 mithos28_: many of the libraries I have to use are imperative by design 01:16 Shambles_: You're talking about the cute tricks you can (ab)use to shorten expressions because so many different things count as False? 01:17 mithos28_: No as in what I have to think about when writing an if because those are considered good style 01:17 Shambles_: Well, Python /is/ intended to be imperative. In fact, Guido seems rather hostile to functional programming style for the most part. 01:17 mithos28_: yes but initializing a structure by setting its fields right after constructing it versus doing so in the constructor is annoying 01:18 mithos28_: the fact that it so tightly tied to C is abnoxious 01:19 mithos28_: at least CPython 01:19 Shambles_: I started out using imperative programming, and still don't have a problem with it, though I can see how functional programming would help with multithreading. I think the only thing that sort of bugs me that could be considered 'functional' is I'm one of those people that likes fluent interfaces (big chains of methods), and the standard library doesn't allow that most of the time. 01:19 Shambles_: Hmm, the constructor thing is sometimes awkward due to only being able to have one constructor. 01:19 mithos28_: racket has one of the best threading models I have seen, as long as you just want concurrency 01:19 Shambles_: How do you mean tied to C? 01:20 (join) vu3rdd 01:20 (quit) vu3rdd: Changing host 01:20 (join) vu3rdd 01:20 mithos28_: a python thread is a c/os thread, there is no way to stop it 01:20 mithos28_: the main thread is special in terms of signals 01:21 Shambles_: Python's concurrency is actually a lot like Racket's places. It also has green threads, like Racket. Nothing like the futures though. 01:21 mithos28_: Not like places at all. 01:21 mithos28_: Like c threading 01:21 Shambles_: It uses separate processes and pipes. 01:22 mithos28_: Not the threading I use 01:22 mithos28_: It is all threads within one process 01:22 Shambles_: Since the global interpreter lock stops 'real' multithreading. 01:22 Shambles_: In CPython? 01:22 mithos28_: yes 01:23 Shambles_: I don't think it can do real concurrency. The GIL is something people foam about constantly, but Guido doesn't want to remove it because it makes it easier to use thread-unsafe C libraries. 01:23 mithos28_: http://docs.python.org/library/threading.html 01:23 mithos28_: You mean parallelism, and yes it cannot 01:24 Shambles_: http://docs.python.org/dev/library/multiprocessing.html <-- this is what most Python folks will tell you to use 01:26 mithos28_: That doesn't solve any issues that I have, and just means that communicating between different thread/processes is more annoying 01:26 Shambles_: Well, the pipes/queues thing stops most of the headaches. 01:27 mithos28_: what happens when you send non python objects over? 01:28 Shambles_: I'm not sure what you were trying to do with signals, but I think it's typical for the main thread to handle all 'console' (graphics, sound, mouse, keyboard), and probably Unix signals, though some of those could happen in a thread whether you wanted them to or not. 01:28 mithos28_: kill a thread like racket's kill-thread 01:28 mithos28_: I want a sane model for asynchronous messages 01:28 mithos28_: and by messages I mean execeptions 01:29 Shambles_: If you mean using a wrapper around some non-thread-safe C code, I have no idea, but it sounds like a extraordinarily bad idea. :P In general "less communication between threads is better" and I'd try to keep it all within the language. 01:30 Shambles_: It's usually not a good idea to spawn threads after a program starts (i.e. other than the 'setup' phase) or to kill them. You usually want dedicated threads or a thread pool. 01:30 mithos28_: why? Threads shouldn't be expensive. 01:31 mithos28_: I should be able to write highly concurrent code that runs at as much parallelism as my machine can support 01:31 Shambles_: Non-green threads are always expensive. And if you have more than you have cores, you're just pessimizing for performance, with perhaps the exception of the main thread handling 'console' tasks, and maybe one to handle filesystem tasks, and one for networking, since all of those should be so lightweight it doesn't matter. The actual worker threads should be 1 per core. 01:34 Shambles_: As for green threads, I suppose they're useful at times, but not for performance. I haven't seen a particularly good use for them, but if you needed something that 'acted like' something doing little bits of a task round-robin, you might be able to use green threads to avoid having to write it yourself. Might not if you need to do something like schedule per (virtual) user, in some server, though. 01:35 mithos28_: Green threads are awesome for any concurrency 01:35 mithos28_: most things are not cpu bound now, so it doesn't matter that they are not parallel 01:35 Shambles_: I'm not sure there's many cases when you want concurrency without parallelism. I know I usually don't. 01:36 mithos28_: networkbound work 01:36 Shambles_: I also find it really hard to get used to differentiating between the two. I know what you're getting at, but "concurrent" usually means "at the same time" which really only exists when there are multiple cores/processors working at the same time. 01:37 Shambles_: I can see how cycling through the connections could be handy for that if you didn't need your own scheduling logic, yes. 01:39 mithos28_: I usually have tasks which need a lot of things to get done that are not sequentially constrained, the fact that I cannot do that without spawning up os tasks in most languages is annoying 01:39 Shambles_: Python has those (they're not C/OS threads... Python doesn't have those, just green threads and the "spawn a new process and talk over shared memory or pipes" thing). I think perhaps there's not been much attention paid to the thread API, since most Python programmers seem to regard it as obsolete. 01:40 mithos28_: Python threads are not that, they are c threads that grab a global lock 01:40 Shambles_: On the other hand, I *do* think Stackless Python is intended for the kind of thing you want to do. 01:41 mithos28_: Or racket 01:41 Shambles_: Well, yeah. :P 01:42 Shambles_: There are some things Python didn't do well (and never will, since they're basically 'functional' things that both aren't often needed, and would offend Guido) that I ended up needing to do, which is why I'm here. 01:42 mithos28_: what are those? 01:42 Shambles_: 99% of the time it worked great for me, though. 01:43 Shambles_: The straw that broke the camel's back was what Python calls the "recursion limit". It's really more of a "stack depth limit", since it doesn't have anything to do with recursion really. 01:43 Shambles_: On rare occasions you will see yourself writing some boilerplate too, which isn't possible to get rid of without macros. 01:44 mithos28_: yeah tail calls, guido is wrong about those 01:44 Shambles_: No, this wasn't tail calls. 01:44 Shambles_: I actually needed to return and do more work. 01:44 Shambles_: I just needed a whole bunch of stack frames. 01:44 mithos28_: and it ran out before an oom? 01:46 Shambles_: By default, Python crashes at around 954 frames. The recursion limit variable defaults to 1000. I was able to set it up to about 9000 and get it to recurse about that deep, which would have been more than enough for my task, but doing that takes up a lot of RAM even if you don't use it, and it's basically the seams starting to give on the language. Worse, it says there's no guarantees about higher limits working on all ver 01:46 Shambles_: Worse, it says there's no guarantees about higher limits working on all versions, so who knows... If I wrote something that set it up to say, 2000, that should have been safe for what I wanted to do, it might blow up on Macs. I don't have one, so I'd never know. :P 01:47 mithos28_: I don't buy the ram argument, because you would have that in any language 01:47 Shambles_: What I was doing was parsing skeletons for animations. It's quite possible to have a snake, or dragon, or something similar have over 1000 bones from nose to tail tip, especially if the designer did things like subdivide a spline. 01:48 Shambles_: Not sure what you don't buy. 01:48 mithos28_: why isn't the ram an issue in racekt? 01:49 Shambles_: C, and most imperative languages, allocate a strip of RAM to use for the call stack. On Windows, last I looked, it was 1MB for binary executables (e.g. C++ programs). Doesn't matter if the computer has 4GB RAM. Once you run out of that 1MB of stack frames, your program crashes. 01:49 Shambles_: It's not a issue in Racket, because like all functional languages I'm aware of, effectively allocates stack frames "on the heap" (from the C/OS perspective). You can fill RAM with them. 01:50 mithos28_: so the problem is that python doesn't let you increase it enough? 01:50 Shambles_: And since people use (non-tail) recursion heavily you don't get things like "well, you can only recurse this much, and if you diddle this variable, you can recurse some more, but it may stop working in the future or on other environments". You just recurse. That's it. 01:51 mithos28_: I buy the non portability of more stack frames, I don't understand why it uses more memory 01:51 Shambles_: Python lets you permanently allocate a bigger strip of RAM, but there's no guarantee it *still* won't crash, even if you're under the limit you set it to (which will always be far less than all of RAM). 01:51 Shambles_: Basically a call stack in most languages is an array. 01:52 Shambles_: It's not a 'spaghetti stack'. Not basically a linked list. 01:52 Shambles_: When you run off the end of the array, you get a stack overflow, and your program dies. 01:52 Shambles_: With functional languages you can't have a stack overflow unless every last byte of RAM is used up. 01:52 Shambles_: Unlike the special little array. 01:53 mithos28_: If it was smart it would mmap it to blank pages until it is used, and you wouldn't pay till then 01:54 Shambles_: Well, it's not 'smart' usually. Imperative languages don't expect you to need to recurse much, and, actually, since function calls are expensive (i.e. slow) they don't /want/ you to. It's usually not a problem untill you need to handle some deep tree like I was doing. 01:54 Shambles_: And most things don't involve handling /deep/ trees, even if you're handling trees. 01:54 mithos28_: function calls are not expensive 01:55 Shambles_: Say, a parser for C, probably won't see code that's got blocks more than 5 or 6 layers deep. That's eensy, stack space wise, unless you're storing a lot on each frame. 01:56 Shambles_: Now C++ programmers get stack overflows all the time. That's because they like storing big arrays on the stack frames rather than heap, because it's both much faster to allocate and free, and safer (no pointer diddling). But again, it all has to do with the little fixed strip of memory versus the big linked list of memory. 01:57 Shambles_: Function calls are expensive, at least in C and C++. Actually I suspect they just plain are expensive, so long as you're not just doing tail recursion, because at the very least there's gonna be a bunch of push and pops to that little array, and in the spaghetti stack case there's going to be calls to allocate RAM from the OS, and stitching the pointers up. 01:58 Shambles_: Of course there's inlining, but you can't do that with everything. 01:59 mithos28_: what is the expensive part, the saving /restoring of registers or the jmp? 02:00 Shambles_: Yes. The housekeeping for the stack frames takes time. In a tight loop, it can actually matter whether something is all one function, or not. Actually, *especially* if it's in a tight loop, since if that's /not/ spread across functions the compiler might actually use SIMD instructions to do it. 02:00 mithos28_: and so does reading from memory not in cache 02:01 Shambles_: Not that they tend to use recent SIMD instruction sets (last I bothered to look Visual Studio was still stuck around SSE2), or that they're particularly good about figuring it out (which is why you have all those proprietary 'hints' to use them). 02:01 (join) _tca 02:01 mithos28_: you could use a better toolchain 02:02 mithos28_: like llvm, now even supported by racket (sorta) 02:02 Shambles_: Memory vs cache is orthogonal to stack frames. If you have to call a function to do something, it's going to be slower than having the code in that function inside the routine that would otherwise call it. 02:02 Shambles_: LLVM doesn't solve any of this. Actually any VM is going to execute slower than machine code, so it would make the problem worse. 02:03 mithos28_: Yes that doesn't mean it is slow 02:04 mithos28_: Yes it is slower, but most things are slower than instructions solely in registers 02:04 mithos28_: llvm would solve the recent simd instruction problem 02:04 Shambles_: I suppose it's all relative, but what I said holds. Imperative programmers have this long history of not liking (non-tail) recursion. It's slow-/er/ than loops, and some argue harder to understand (not sure where I stand on that... I've seen things made easier to me, and some harder, depending on how natural the fit seemed). 02:05 Shambles_: So imperative languages tend to not bother supporting deep call stacks. You're not supposed to do it that way in those languages. 02:05 jonrafkind: scheme supports tail recursion, IMO, soley due to the recursive nature of traversing immutable datastructures 02:06 mithos28_: jonrafkind: I think it might also be so that it models the lambda calculus 02:06 Shambles_: Well, there's really no inherant penalty to tail-recursion, since it is, literally, just a loop. The "deep stacks are bad, umkay?" thing really only effects the non-tail-recursion. 02:07 Shambles_: So, what a imperative programmer would say to me is "suck it up... manage your own stack, it's not like problems where you actually /need/ deep stacks are common" (which is true). Old ones would say "I can remember back in Fortran 77 we didn't even /have/ a call stack, and we liked it" (also true). 02:08 Shambles_: On the other hand, I could say "look, I don't really care if it's a little slow, since I'm only going to do this one or two places in my program where the data is read in" which is why I started looking at other languages. :P 02:12 Shambles_: And it's more 'different' than better or worse I suppose. Yeah, using lots of itty functions all over will probably cost me some run time performance relative to big ugly procedures/methods with lots of loops in imperative languages. On the other hand, those languages usually don't have a reasonable macro system, which would let you do a lot of precomputing at compile time. It probably comes close to evening out. 02:13 (quit) mithos28_: Read error: Connection reset by peer 02:13 (join) mithos28 02:13 Shambles_: That, and performance isn't all that matters to me. 02:13 (quit) jonrafkind: Ping timeout: 244 seconds 02:14 (quit) duomo: Ping timeout: 248 seconds 02:24 (join) veer 02:27 (join) chemuduguntar 02:33 (quit) Kaylin: Quit: Leaving. 02:36 (quit) mithos28: Quit: mithos28 02:38 (join) gciolli 02:44 (quit) gciolli: Ping timeout: 244 seconds 02:50 (quit) neilv: Quit: Leaving 02:51 (join) antithesis 03:18 (join) djcoin 03:27 (join) gciolli 03:30 (join) RacketCommitBot 03:30 RacketCommitBot: [racket] plt pushed 1 new commit to master: http://git.io/S3clhA 03:30 RacketCommitBot: [racket/master] New Racket version 5.3.0.11. - Eli Barzilay 03:30 (part) RacketCommitBot 03:36 (join) mithos28 03:37 (join) rbarraud_ 03:47 (nick) hyko- -> hyko 03:57 tim-brown: ltu has a thread on google blockly. http://lambda-the-ultimate.org/node/4540 ; is there something similar implemented in racket (or way back, mzscheme)? i seem to remember some such 04:02 (quit) veer: Quit: Leaving 04:03 (join) dzhus 04:07 (quit) mithos28: Quit: mithos28 04:07 (join) cdidd 04:20 (quit) chemuduguntar: Ping timeout: 265 seconds 04:22 (quit) rbarraud_: Remote host closed the connection 04:45 (join) noelw 05:22 (quit) adu: Quit: adu 05:44 (quit) BeLucid_: Remote host closed the connection 05:44 (join) BeLucid 05:52 (join) veer 06:26 (join) masm 06:47 (join) jeapostrophe 06:52 (quit) PfhatWork: Read error: Connection reset by peer 06:54 (join) PfhatWork 06:55 (join) jesyspa 07:02 (join) SeanTAllen 07:02 (quit) SeanTAllen: Client Quit 07:03 (join) SeanTAllen 07:21 (quit) jeapostrophe: Quit: Lost terminal 07:22 (join) jeapostrophe 07:25 (quit) PfhatWork: Read error: Connection reset by peer 07:27 (join) PfhatWork 07:43 (join) kanak 07:49 (quit) kanak: Quit: Leaving. 07:51 (quit) jeapostrophe: Ping timeout: 252 seconds 08:07 (quit) jesyspa: Ping timeout: 244 seconds 08:09 (join) jesyspa 08:17 (quit) Shviller: Ping timeout: 260 seconds 08:18 (join) Shviller 08:23 (join) kanak 08:28 (quit) jesyspa: Read error: Connection reset by peer 08:45 (quit) vu3rdd: Ping timeout: 240 seconds 08:46 (join) jonathansizz 08:46 (join) getpwnam 08:47 (join) hash_table 08:55 (join) jao 08:56 (quit) jao: Changing host 08:56 (join) jao 09:02 (join) dnolen 09:07 (quit) jao: Remote host closed the connection 09:08 (join) jesyspa 09:11 (quit) acarrico1: Ping timeout: 265 seconds 09:29 (quit) jonathansizz: Ping timeout: 245 seconds 09:29 (quit) hash_table: Ping timeout: 245 seconds 09:30 (quit) getpwnam: Ping timeout: 245 seconds 09:36 (quit) jesyspa: Read error: Connection reset by peer 09:41 (join) jesyspa 09:49 (join) mmalorni 09:51 (quit) jesyspa: Read error: Connection reset by peer 09:51 (join) netrino 10:02 (join) snearch 10:11 (join) __rahul__ 10:12 (quit) __rahul__: Client Quit 10:19 (quit) antithesis: Quit: antithesis 10:27 (quit) veer: Quit: Leaving 10:45 (join) getpwnam 10:45 (join) jonathansizz 10:45 (join) hash_table 10:57 (quit) dspt: Read error: Connection reset by peer 11:09 (join) RacketCommitBot 11:09 RacketCommitBot: [racket] plt pushed 1 new commit to master: http://git.io/o0kSXA 11:09 RacketCommitBot: [racket/master] Fix type of exact->inexact. - Vincent St-Amour 11:09 (part) RacketCommitBot 11:16 (join) adu 11:22 (join) jacius 11:35 (quit) gciolli: Quit: Leaving. 11:42 (join) mceier 11:45 (quit) PfhatWork: Ping timeout: 265 seconds 11:47 (join) antithesis 12:00 (join) Kaylin 12:03 (quit) adu: Quit: adu 12:05 (quit) tim-brown: Remote host closed the connection 12:09 (quit) hash_table: Ping timeout: 244 seconds 12:09 (quit) jonathansizz: Ping timeout: 244 seconds 12:09 (quit) getpwnam: Ping timeout: 244 seconds 12:16 (join) anRch 12:19 (join) RacketCommitBot 12:19 RacketCommitBot: [racket] plt pushed 1 new commit to master: http://git.io/I7W6Ug 12:19 RacketCommitBot: [racket/master] Improve docs & errors for control proxies - Asumu Takikawa 12:19 (part) RacketCommitBot 12:20 (join) evalapply 12:25 (quit) noelw: Quit: noelw 12:31 (join) noelw 12:35 (quit) snearch: Quit: Verlassend 12:36 (quit) noelw: Client Quit 12:45 (quit) djcoin: Quit: WeeChat 0.3.2 12:47 (join) jesyspa 12:49 (join) aalix 13:14 (quit) anRch: Quit: anRch 13:18 (join) acarrico 13:26 (quit) Kaylin: Quit: Leaving. 13:30 eli: sizz_ asumu: http://www.99-bottles-of-beer.net/language-racket-2883.html 13:32 (join) netrino_ 13:33 (quit) netrino: Read error: Operation timed out 13:33 (quit) jesyspa: Ping timeout: 252 seconds 13:35 (join) jesyspa 13:39 (quit) ssbr_: Ping timeout: 260 seconds 13:39 (join) jonrafkind 13:46 (quit) evalapply: Remote host closed the connection 14:00 (join) adu 14:02 (quit) jonrafkind: Ping timeout: 256 seconds 14:14 asumu: eli: much nicer 14:29 (join) jonrafkind 14:29 (quit) jonrafkind: Changing host 14:29 (join) jonrafkind 15:19 (join) __rahul__ 15:27 (join) RacketCommitBot 15:27 RacketCommitBot: [racket] plt pushed 1 new commit to master: http://git.io/uGGp7g 15:27 RacketCommitBot: [racket/master] Fixed type errors uncovered by correction to type of exact->inexact (i.e. change to real->double-flonum) - Neil Toronto 15:27 (part) RacketCommitBot 15:34 (join) jao 15:34 (quit) jao: Changing host 15:34 (join) jao 15:39 (join) MayDaniel 15:47 (quit) jesyspa: Ping timeout: 244 seconds 15:48 (join) yoklov 15:53 (quit) kanak: Ping timeout: 252 seconds 15:55 (join) jesyspa 16:01 (join) sstrickl 16:03 (quit) MayDaniel: Read error: Connection reset by peer 16:03 (quit) jacius: Remote host closed the connection 16:03 (join) MayDaniel 16:13 (quit) __rahul__: Quit: Leaving 16:18 (quit) MayDaniel: Read error: Connection reset by peer 16:19 (quit) jesyspa: Read error: Connection reset by peer 16:21 (join) jesyspa 16:35 (quit) jao: Remote host closed the connection 16:41 (quit) jesyspa: Read error: Connection reset by peer 16:43 (join) jesyspa 16:45 jonrafkind: are there any languages with lexical scopes you can refer to by name? something like (let ([x 1]) (let ([x 2]) outer.x) 16:45 jonrafkind: you might say 'whats the point', but its for when languages have constructs that have their own lexical scoping rules, like class systems 16:46 jonrafkind: or I guess constructs that violate hygiene basically 16:47 (quit) antithesis: Remote host closed the connection 16:50 (join) antithesis 16:52 (join) anRch 16:54 (quit) jesyspa: Ping timeout: 265 seconds 16:55 (join) jesyspa 16:56 (quit) antithesis: Remote host closed the connection 17:00 (quit) jesyspa: Ping timeout: 244 seconds 17:01 (join) jesyspa 17:06 (join) MayDaniel 17:13 (quit) dnolen: Ping timeout: 256 seconds 17:19 danking: jonrafkind: MIT/GNU Scheme has first class environments 17:20 danking: They're used to implement modes in Edwin, IRC. 17:20 jonrafkind: ok, i dont see the relation between environments and modes.. but whatever 17:20 jonrafkind: also you meant IIRC :p. IRC is internet relay chat 17:20 danking: aye I missed the first I 17:21 (join) rbarraud 17:21 danking: jonrafkind: I don't recall the details as I wasn't hacking on Edwin in particular, but I think they were used to implement modules and modules were used to implement modes. 17:21 jonrafkind: aha 17:30 danking: It's gonna be so sweet when I can hack Emacs in Guile. 17:30 (quit) MayDaniel: Read error: Connection reset by peer 17:31 (quit) mceier: Quit: leaving 17:33 jonrafkind: jlambda-the-ultimate.org/node/3861 looks like a good discussion on it 17:33 jonrafkind: oops 17:33 jonrafkind: http://lambda-the-ultimate.org/node/3861 17:34 danking: jonrafkind: What're you building with the ability to refer to scopes by name? 17:35 danking: Alternatively, why did you ask your first question? 17:36 jonrafkind: in java and scala you can get into a situation where you cannot refer to an outer variable from inside a new class. 'val x = 5; new Bar(){ val q = x }'. if Bar has a field named 'x' then you cannot refer to the outer 'x' binding 17:36 jonrafkind: there doesn't seem to be a solution for this, i was wondering if statically named scopes would help. they dont have to be first class 17:41 (join) getpwnam 17:41 (join) jonathansizz 17:43 danking: hmm. That does seem like annoying behavior. What is the meaning of a brace enclosed expression after a java/scala constructor? 17:46 jonrafkind: it makes an immediate sub-class with an arbitrary body 17:46 jonrafkind: usually called an anonymous inner class 17:48 danking: That seems really anoying that the scope is coming from elsewhere. It'd be nice if fields always had to be accessed as fields, i.e. this.x. 17:48 danking: I think that would make that an unambiguous reference to the prior x, right? 17:49 jonrafkind: yea 17:52 (quit) anRch: Quit: anRch 17:57 sizz_: eli: excellent! 17:58 Shambles_: "fields always have to be accessed as this.x" sounds like Python, actually. And you can 'control' scope to an extend there. As in you can import things naturally and end up with a potentially long dotted path, or you can import them into your current namespace and use shorter paths. 17:58 Shambles_: A lot of people don't seem to like all the typing of "self" in Python, but I guess it has its uses. 17:59 jonrafkind: well python is sort of a non-issue because its idea of lexical scoping is broken 17:59 danking: haha, how so? 17:59 jonrafkind: x = 0 def foo(): x = 5; you cannot refer to the outer x 18:00 jonrafkind: unless you make it an array 18:00 jonrafkind: x = [0] def foo(): x[0] = 5 18:00 jonrafkind: and im pretty sure you cant do x = 0; def foo(): print x 18:00 Shambles_: You can. 18:00 jonrafkind: ah wait that works, there is somehitng else similar to it that doesnt work 18:01 sizz_: eli: it's amazing how many submissions on the 99 bottles site give totally incorrect output! 18:02 Shambles_: I don't recall anything 'surprising' about scoping. The main odd things are you have to use "self" all the time to refer to fields, even when defining methods inside the original class definition, and each file gets its own namespace without any extra work (whether it likes it or not), and you can do a lot of cute importing tricks. 18:03 Shambles_: That said my notion of what is "normal" scoping comes from the imperative world, so if C's scoping seems really weird to you, then you might find Python surprising. 18:04 danking: I imagine that accessing fields as fields rather than as local variables makes a lot of sense in Python if classes are first class. 18:04 danking: Are they? 18:04 friscosam: yes 18:04 jamessan: jonrafkind: x = 0; def foo(): global x; x = 5 18:05 friscosam: python is much easier if you just try not to use globals 18:05 friscosam: or at least assign to them 18:05 Shambles_: Most things seem to be first class in Python. You can pass around and redefine things (and parts of things) on the fly. Unlike Ruby, though, doing this kind of thing all over is strongly disapproved of. It's possible, but considered "unpythonic". 18:05 stamourv: Bleh. This is Wat material. 18:05 friscosam: er "don't assign to them" 18:05 jonrafkind: jamessan, now do that with 3 scopes and it breaks 18:05 jonrafkind: x = 0; def foo(): x = 5; def bar(): global x; x = 2 18:06 jamessan: jonrafkind: that's why a project I work on has a "dynamic" object. dynamic.x would walk back through your scopes to find the nearest x :) 18:06 Shambles_: Some people take objection to the limits of Python's lambda. It's pretty limited. No 'statements' (roughly equivalent to 'special forms' in Lisp) can go inside, which means they are only useful for very simple expressions. They do 'capture' outside themselves the way you'd expect, though. 18:06 jonrafkind: jamessan, why not just use 'x' ? 18:06 jonrafkind: python's main problem is that it doesn't differentiate between assignment and making new names. both use the syntax 'x = 0' 18:08 jamessan: jonrafkind: just 'x' doesn't help when you're trying to get the dynamically scoped x... and now my brain clicks and realize you're talking purely about lexical scope 18:08 jonrafkind: why would you want dynamic scoping :( 18:08 jonrafkind: unless youa re doing something like parameters 18:08 Shambles_: You can't just use x because Python needs to know 'which x' you're referring to. jonrafkind's statement about differentiating allocation and assignment is true of Python, but also of pretty much every imperative dynamically type checked language. 18:09 Shambles_: It's generally loved by the people that like those languages, who don't want to have to put up with a lot of declaration boilerplate. 18:09 jonrafkind: Shambles_, most other languages have some syntax for declaring new variables 18:09 jonrafkind: int x; my $x; var x; etc.. 18:10 Shambles_: jonrafkind: Not dynamically type checked ones. For most, when you "blarg = somecrap" if blarg doesn't exist, it makes blarg. Great for saving typing. Can cause problems if you typo what you assign to though. 18:10 jonrafkind: i listed perl and javascript as examples. both have some syntax for that 18:10 jamessan: jonrafkind: yeah, it's basically parameters. current irc msg in the scope of a triggered command for an irc bot 18:11 danking: Shambles_: I don't know if dynamic typing is really the trouble here but rather that declaration is not required. 18:11 jonrafkind: scala is statically typed but uses 'val x = ...' as well, so no it has nothing to do with typing 18:11 Shambles_: VisualBasic / VBScript do too, though it has to be turned on explicitly. Again, what Python does there is pretty typical, and most people that like dynamically type checked imperative languages don't want variable declarations. 18:12 jonrafkind: Shambles_, perhaps they are typical but most javascript tutorials will tell you to always use 'var' when declaring variables. similarly if you use 'use strict' in perl it will warn if you declare a new variable without 'my' 18:12 Shambles_: The relationship is primarily that people don't like the typing (with the keyboard) that goes with typing (statically, as in checking). Hence, less typing is better, hence, no variable declarations is better. 18:12 jonrafkind: so using the 'x = 0' for declaration is considered bad behavior 18:13 danking: jonrafkind: I find this non-obvious in python, but I suppose that's the Racketeer in me showing through: flist = []; for m in ('do', 're', 'mi'): flist.append(lambda: m); for f in flist: print f(); 18:13 jonrafkind: shortening typing is not a main motivation dynamically typed languages exist.. 18:14 Shambles_: And yes, there's type inference and whatnot, but really low effort type inference tends to put constraints on the language (no OO, no operator overloading) that most programmers object to, so in practice it tends to not be as widely used as stuff that just does dynamic type checking. 18:14 jonrafkind: danking, yea thats what i was thinking of earlier. you have to make a new function that captures the value of 'm' and use that instead 18:14 danking: jonrafkind: >_> Mutation hurts my brain. 18:14 jonrafkind: well.. so does unhygienic languages too probably :p 18:15 Shambles_: jonrafkind: Opinions differ I'm sure. *Many* programmers would, I'm sure, switch this very minute to statically type checked languages if they could use them just like they use Python now, with the exception of assigning different types (e.g. strings and integers) to the same (non-tagged-union) identifier. I *do* think the extra typing (at the keyboard) is the main motivation. 18:16 Shambles_: jonrafkind: Especially since it's possible to do things like type inference without intrusive/complex type system (i.e. no Haskell required). 18:16 jonrafkind: i sincerely think having to type 'var' would not be that hard for people 18:16 danking: We could call it "let" if people think "var" is outmoded. 18:16 (quit) cdidd: Remote host closed the connection 18:17 Shambles_: Not that hard, but why bother? It's not /that hard/ to just write everything out without ever using macros in Lisp. It's actually the way 99% of programmers get by, since they don't have powerful macros in most languages (Python has nothing similar at all, not even something nasty like template metaprogramming). It's more effort though. 18:18 jonrafkind: because it makes the rules of lexical scoping more obvious, and fixes the bug with having to declare something as an array if you want to use it in an inner scope 18:18 jonrafkind: comparing typing 'var' to using macros is ridiculous 18:18 Shambles_: It's nearly impossible to just get something done, even if it doesn't work reliably, as fast as you can do it in a dynamically type checked language as it is in a statically type checked one. 18:19 danking: Shambles_: Because something like the `match' macro saves me significantly more typing than three letters and it actually makes the code _more_ readable. On the other hand, "let" is one extra lexeme and it allows the compiler/interpreter to report msipellings. 18:19 Shambles_: It's not really a "bug" to have to say "self" when you mean "the fields of the class I'm apart of" or "global" when you mean "global" as opposed to lexical scope. It's more explicit. You don't have to do it in the most common case where you really do mean the variable within your same scope. 18:20 (join) gciolli 18:21 Shambles_: That's actually been Guido's reason for not removing "self", though it comes up all the time. It's given people the idea that Python didn't start out with classes, even though it did. Guido likes that it's explicit, where the variable you're using comes from. 18:21 danking: Shambles_: So does common sense tell you that when I write "my_boject" that I wanted to create a new variable or that I mispelled something. 18:21 danking: s/./?/ 18:21 (quit) mmalorni: Read error: Operation timed out 18:23 Shambles_: danking: Yup. If you wanted to avoid stating whether you were creating a variable every time. Everything has a price. You want good static checking, you have to type (at the keyboard) more. The better the static checking, the more you have to type, to the point of it becoming very painful to do anything at all (you might have to use a proof assistant, as in do some work manually, if you really want to go to the ultimate e 18:23 Shambles_: if you really want to go to the ultimate extreme). 18:23 Shambles_: Personally, for the stuff I used Python for, I would /not/ want to have to type anything extra to create a variable. 18:24 Shambles_: Then again, I spell-check my code and use real names, so I pretty much never have the typo problem, and it catches typos in the actual text (strings, comments) too. 18:24 asumu: I've been screwed over so much writing Ruby code due to implicit variables. 18:25 asumu: Typos turn into meaningful garbage. 18:25 danking: Personally, I find myself with at least a 3:1 ratio of maintenance:creation. 18:25 Shambles_: Which seems more useful to me than something to duct tape a little bit of static checking on a language that you can't /really/ tell much of anything useful about at compile time. I mean, seriously, you can replace parts of a class on the fly, and crawl up your call stack and screw with the stuff in the stack frames in Python. If you wanted /anything/ statically checked, this isn't your language. 18:26 Shambles_: It's basically Perl or Ruby, but with really readable syntax, and a culture that's anti-'cute'-code. 18:26 asumu: It's not really duct tape. It's not totally black or white. There's the possibility of a pragmatic middle ground here. 18:26 Shambles_: On the other hand if you want Python, but with static typing, look at Cobra. That's basically what it's for. That, and getting rid of null type errors. 18:29 (quit) gciolli: Ping timeout: 256 seconds 18:40 Shambles_: danking: As an aside, your list handling code in Python, that's not the way you'd do it. You'd use a List comprehension, which looks a awful lot like it would in Haskell. There are also set comprehensions and dictionary comprehensions, that work the way you'd expect. There's generator expressions that amount to lazy list comprehensions if you're trying to avoid large allocations. 18:49 Shambles_: for y in [x for x in ('do', 're', 'mi')]: print y 18:52 Shambles_: or this... for f in [(lambda : x) for x in ('do', 're', 'mi')]: print f() 18:52 Shambles_: Which I guess is a more direct translation 18:54 Shambles_: The reason you get "mi" "mi" "mi" is the external reference (x) being changed to "mi" on the final iteration, so that's what the lambda points to, and what gets printed in the end. 19:00 Shambles_: I suppose a generator expression would be better (more memory efficient), at least if the tuple had more than 3 entries. Just change the square brackets to parentheses... for f in ((lambda : x) for x in ('do', 're', 'mi')): print f() 19:06 (quit) sstrickl: Quit: sstrickl 19:16 danking: Shambles_: Wait, so the syntax to produce a generator and the syntax to produce an array are the same save for choice of delimeters but one uses the same variable, mutating it for each iteration and the other creates a fresh binding for x on each iteration? 19:17 Shambles_: I'm not sure how arrays come into the discussion, but generator expressions are done by using parens, which means you only allocate one units worth on each iteration of the for. If you used a list comprehension (square brackets) you allocate the whole list before the for loop starts. 19:18 Shambles_: The generator will give you the behavior you wanted. 19:20 danking: Shambles_: What is the result of the [... for ... in ...], an array or a list? 19:20 Shambles_: If you /really/ want to use Python functionally, you generally can, outside the points where you need to do I/O, like the necessity of that for loop, though technically you can use functions that perform I/O inside comprehensions. Doing so would be bad taste. 19:20 Shambles_: The result of that is a list. 19:20 Shambles_: The whole thing at once. 19:21 danking: Alright then I meant lists. 19:21 Shambles_: So if it had 10,000 elements, you'd have to allocate a huge list before the loop could start. 19:22 (quit) jonrafkind: Ping timeout: 246 seconds 19:23 Shambles_: The result of the same thing in parens is called a generator object. All the iterators in Python (there's a whole library of them, not just for) are designed to take those anywhere they'd take any other sequence. 19:23 Shambles_: Saves memory. 19:24 danking: It's not the concept of a generator that bothers me, it's that in the list comprehension syntax there is only _one_ binding of x that every expression shares and in the generators there is a fresh binding of x for each element of the iterated data. 19:24 (quit) netrino_: Quit: Ave! 19:25 (join) peeeep 19:25 danking: Perhaps the implementation of each piece of syntax makes one or the other semantics easier or faster, but I find it frustrating that the binding structure isn't clear from the source. 19:26 danking: But that's why I'm a Schemer and not a Pythonista. 19:26 (join) hash_table 19:27 (quit) jonathansizz: Quit: bye 19:28 (join) jonathansizz 19:30 sizz_: someone should write a python replacement and call it mongoose 19:35 (quit) dzhus: Ping timeout: 248 seconds 19:35 (quit) aalix: Ping timeout: 260 seconds 19:36 (quit) adu: Quit: adu 19:39 (join) jonrafkind 19:39 (quit) jonrafkind: Changing host 19:39 (join) jonrafkind 19:45 (quit) yoklov: Quit: computer sleeping 19:46 (join) RacketCommitBot 19:46 RacketCommitBot: [racket] plt pushed 1 new commit to master: http://git.io/BU5WAQ 19:46 RacketCommitBot: [racket/master] fix `raco setup' "nothing to do" check w.r.t. Planet paths - Matthew Flatt 19:46 (part) RacketCommitBot 19:46 (join) yoklov 19:51 (quit) masm: Quit: Leaving. 19:57 ozzloy: what's the best way to do postgresql in racket for someone who's not familiar with db stuff 19:57 ozzloy: just need simple db stuff 19:58 ozzloy: plain selects and possibly inserts 20:00 (join) noam_ 20:01 ozzloy: oh, nm, forget all that 20:01 (quit) noam: Read error: Connection reset by peer 20:03 ozzloy: http://pastebin.com/5Djm5LKM 20:04 ozzloy: how do i fix this missing collection problem with db stuff? 20:08 (join) adu 20:11 (join) didi 20:17 didi: I'm trying to find, in the sources, the function responsible for hashing values for sets and hashtables, for example. Could someone point me out to where it is or is it not that direct? 20:18 (join) sstrickl 20:23 asumu: ozzloy: it's db/postgresql 20:24 (quit) stchang: Read error: Operation timed out 20:25 ozzloy: asumu, yay! 20:25 ozzloy sheepishly crawls to the corner 20:26 ozzloy: sorry about not reading 20:27 (join) stchang 20:27 asumu: didi: equal_hash_key in hash.c should be it. 20:27 didi: asumu: Aaaah... .c 20:27 asumu: https://github.com/plt/racket/blob/master/src/racket/src/hash.c 20:27 didi: asumu: Thank you. 20:28 asumu: Yep. It's a generic interface though, so high-level things use the prop:equal+hash interface to define equality/hash. 20:29 didi: asumu: Nice. Thank you. 20:30 didi: Uh, it can hash a lot. 20:35 (quit) stchang: Read error: Operation timed out 20:37 (join) stchang 20:38 Shambles_: danking: Do you have to deal with Python day to day? 20:38 Shambles_: I'm sorry for the big delay. I had to go AFK quite a while. I'm not feeling well. 20:43 (quit) jesyspa: Quit: leaving 20:45 (quit) jonrafkind: Ping timeout: 248 seconds 20:47 sizz_: I'm currently taking intro to computer science 1 & 2 concurrently. We're using C++, and it sure does make me appreciate Racket all the more! 20:47 Shambles_: sizz_: *laugh* I bet! 20:48 sizz_: I have to get through close to 1000 pages of Absolute C++ by the end of next month! 20:48 Shambles_: sizz_: Maybe you can look at it as some sort of primitive tribal hazing ritual, and look forward to the fact that things will probably be better in the future. ;) 20:48 sizz_: Well, then I want to take the two algorithms classes on courera, via princeton, which start in August. So I'll have to switch to Java, which I've also never tried. 20:49 sizz_: But I suppose Java and C++ are quite similar 20:49 didi: sizz_: I don't think so. 20:49 Shambles_: sizz_: I'm surprised your school is using that for the intro language. When I was at the university it was Pascal, slowly changing over to C++, and then to Java. Now some universities are switching to higher level languages like Python. 20:50 sizz_: I'll have a couple of weeks to learn the differences 20:50 sizz_: I'm a grad student, and the only class I could find this summer is at a university down the road 20:51 sizz_: I use perl a lot in the lab, but I decided I need to learn more formally and rigorously 20:51 Shambles_: Java is to C++ as a mole hill is to Mt. Everest, in terms of the pain involved. It's a combination of the VM catching a lot of things that don't /necessarily/ get caught at run time in C++ (e.g. array indexing problems), and the stuff you just can't do in Java, and probably shouldn't in C++, like template metaprogramming. 20:51 sizz_: So Jave should seem easy after C++ then? 20:51 sizz_: *Java 20:51 didi: Shambles_: You can still find Pascal being taught as the first language. 20:51 asumu: Some universities use Racket. :) 20:52 adu: sizz_: C++ is the worst language ever 20:52 Shambles_: A quick view of the difference might be... Java doesn't have multiple inheritance. Java has interfaces which kindasorta handles some of the problems of multiple inheritance, at least making it /look/ like multiple inheritance was used. Java doesn't have template metaprogramming or anything similar (there are generics for just swapping types out though). 20:52 didi: C is also very common in engineering. 20:54 Shambles_: Java allocates essentially everything but basic types on the heap. C++ lets you allocate anything on the stack, which is mighty handy for speed/reliability. Java is garbage collected, C++ isn't. Java has a useful standard library, and IMO C++ doesn't. Java comes with a standard library for doing modern real world tasks like GUI's, sound, and networking. Writing portable code is a lot easier because of that. 20:55 Shambles_: That's about all I can think of. 20:57 Shambles_: I don't know as it's the worst non-intentionally-esoteric language (I mean APL and TECO are really pretty awful, and I can think of others), but it's way up there. Imagine you start with C. C is pretty simple, and was a lot better than what came before it. It's problems include being poorly defined (most things of interest are undefined or implementation defined), 20:57 adu: sizz_: how long have you been writing in C++? 20:57 sizz_: since last week 20:57 adu: oh ok 20:57 sizz_: they're going slow 20:58 adu: so you probably would know the syntax for a pure virtual constructor 20:58 sizz_: sure 20:59 Shambles_: a frustrating (linking info separate from libraries, and manually specified; i.e. headers) linking system, a extremely error prone preprocessor that really can only safely be used for handling that linking problem (header inclusion) and selective compilation but tends to get used to make really unreliable substitution-based macros... 20:59 sizz_: like I said, I want to take the algorithms classes here: https://www.coursera.org/courses 20:59 sizz_: and they say I just need a 'basic familiarity with Java' 21:00 sizz_: so I thought I could get that in two weeks after my current classes are over 21:00 sizz_: having gone through C++ 21:00 Shambles_: Now imagine some guy starts out with the idea of... "classes are cool, let's add classes to C". He then proceeds to do that, carefully avoids fixing any problems with C, and exacerbates them greatly in places (mostly with templates, and how they can be abused). That's C++. 21:01 Shambles_: Oh yes, add a /sprawling/ standard library that somehow avoids including anything you'd need for modern cross-platform programming. 21:01 adu: then throw in RTTI and first class types 21:02 sizz_: you guys are really making me extra-enthusiastic about the next few weeks ;) 21:02 adu: sizz_: are you being sarcastic? 21:02 Shambles_: For practical purposes Java is a lot like C++ "without the bad parts". 21:03 Shambles_: It also didn't really add any good parts other than a (really) useful standard library, but hey, at least most of the bad stuff is gone. 21:03 adu: sizz_: in C, f(x) can mean 3 things: direct function call, indirect function call, or macro expansion 21:03 adu: sizz_: in C++, f(x) can mean around 150 things 21:03 Shambles_: XD 21:04 adu: in Java, f(x) means: method call. 21:04 Shambles_: Yeah, don't expect to see much in the way of tools that read C++ source. It's too much of a pain in the ass to parse. 21:04 sizz_: adu: yes 21:06 adu: but now that I think about it, (f x) in Racket could mean lots of things 21:06 didi: adu: It can also mean variable declaration. 21:06 adu: f could be a procedure or a syntactic keyword 21:08 Shambles_: I may be naive, but I don't expect Lisps to be terribly hard to parse. Most of what 'means' something has to do with the identifiers involved. Certain things define macros to be executed at compile time, at which point their output gets inserted into where they were called. The rest is going to just be evaluation. There are comments, and some shorthand parts, but that's still nothing compared to most languages. 21:08 didi: http://codepad.org/AEPV8uV7 21:09 adu: f.x could mean 5 things in Go 21:09 adu: iirc 21:09 Shambles_: Oh yes, enjoy the fact that Scheme comments nest properly unlike C and C++. Not sure about Java, but I suspect they don't. 21:11 Shambles_: Actually there aren't many languages I can think of that got that right. ML and derivatives do. 21:33 adu: Shambles_: that was always my rationale behind using // because most editors support doing that to a big block 21:34 Shambles_: adu: The fact that blocks don't nest properly has lead a lot of people to do that yes. It would have been better to just make them nest properly though. 21:35 adu: agreed 21:36 (part) didi: "ERC Version 5.3 (IRC client for Emacs)" 21:50 (join) rbarraud_ 21:53 (quit) rbarraud: Ping timeout: 252 seconds 22:05 (quit) rbarraud_: Remote host closed the connection 22:18 (join) jeapostrophe 22:18 (quit) jeapostrophe: Changing host 22:18 (join) jeapostrophe 22:24 (join) rbarraud 22:34 (quit) rbarraud: Ping timeout: 244 seconds 22:44 (quit) Demosthenes: Quit: Lost terminal 22:44 (quit) jeapostrophe: Ping timeout: 244 seconds 22:45 (join) jonrafkind 22:45 (quit) jonrafkind: Changing host 22:45 (join) jonrafkind 22:46 (join) mithos28 22:53 (join) drumond19 22:56 (join) vu3rdd 22:56 (quit) vu3rdd: Changing host 22:56 (join) vu3rdd 22:57 (join) Demosthenes 23:04 (quit) adu: Quit: adu 23:12 (quit) drumond19: Remote host closed the connection 23:12 (quit) yoklov: Quit: bye! 23:15 (join) veer 23:29 (quit) em: Ping timeout: 256 seconds 23:29 (join) em 23:34 (join) mithos28_ 23:35 (join) dnolen 23:38 (quit) mithos28: Ping timeout: 244 seconds 23:38 (nick) mithos28_ -> mithos28 23:40 (join) mithos28 23:43 (quit) Demosthenes: Ping timeout: 244 seconds 23:45 (join) adu 23:48 veer: good news from user list : Matthias Felleisen has been selected as 2012 winner of SIGPLAN Achievement Award 23:48 asumu: Yep, hooray! 23:48 (join) jacius 23:48 veer: btw just out of curiosity is it true that Robby Findler , Mathew Flatt and Shriram krisnamurti students of Matthias Fellisen ? 23:48 mithos28: yes 23:49 veer: wow taught directly from master :) 23:55 (quit) hash_table: Ping timeout: 240 seconds 23:55 (quit) getpwnam: Ping timeout: 245 seconds 23:55 (quit) jonathansizz: Ping timeout: 244 seconds 23:56 (join) Demosthenes