2009-09-24
| 00:10 | mabes | can anyone explain to me why I'm getting this error? |
| 00:10 | mabes | ,(def l '(1 2 3)) (defn look_at_first (first l)) |
| 00:10 | clojurebot | DENIED |
| 00:10 | mabes | hrm.. well the error is: java.lang.RuntimeException: java.lang.IllegalArgumentException: Don't know how to create ISeq from: Symbol (NO_SOURCE_FILE:22) |
| 00:11 | mabes | I can say (first l) but I can't say than in a function |
| 00:11 | mabes | it seems like l doesn't resolve to a sequence in the function for some reason |
| 00:12 | hiredman | ok |
| 00:12 | hiredman | ,(doc defn) |
| 00:12 | clojurebot | "([name doc-string? attr-map? [params*] body] [name doc-string? attr-map? ([params*] body) + attr-map?]); Same as (def name (fn [params* ] exprs*)) or (def name (fn ([params* ] exprs*)+)) with any doc-string or attrs added to the var metadata" |
| 00:13 | hiredman | defn is for defining functions |
| 00:13 | mabes | right, which is what I want to do.. I see what I am doing wrong though.. I need to have an empty vector |
| 00:13 | mabes | even if I don't have any args |
| 00:13 | hiredman | yes |
| 00:15 | hiredman | I recommend looking at example code, of which there is some on clojure.org, some on core.clj, and some in the pastebin |
| 00:16 | hiredman | http://delicious.com/clojurebot/pastbin <-- not all of the code here is good, but there is some good code there |
| 00:17 | mabes | ok thanks, I actually have the book by Stuart Holloway I was just playing around in the REPL and ran into that.. I forgot about needing to always pass a vector |
| 00:18 | hiredman | http://delicious.com/clojurebot/pastbin+chouser should all be good |
| 08:29 | chouser | http://n01se.net/paste/4CK -- Currying |
| 08:57 | hamza | hey guys, i have a question regarding memoize call i have a function that reads a directory and returs a list of files in it. can memonize be used in this situation to cache directory listing? |
| 08:57 | Fossi | if you don't want to find new files or directoriess |
| 08:58 | hamza | that would be my second question files will only be updated by the application is there a way to tell memoize to reset when i edit the files? |
| 09:02 | Chouser | you'd have to re-run memoize itself and start over with a completely empty cache. |
| 09:03 | hamza | kk thx. |
| 09:04 | Chouser | or write your own memoize so that you can delete subsets of the cache as needed |
| 09:06 | hamza | is there a restriction for memoize or can i use it on any funtion i want? |
| 09:10 | Chouser | nothing will stop you from using it on any clojure function, but of course it may behave weirdly if used on non-pure functions. |
| 09:11 | hamza | kk thx. all the functions i am planning to use on disk io functions. |
| 09:11 | Chouser | I would generally consider those non-pure, so use with care. |
| 09:12 | Chouser | ,(let [p (memoize println)] (doseq [i [1 2 3 2 1 0 1 2]] (p i))) |
| 09:12 | clojurebot | 1 2 3 0 |
| 09:13 | hamza | files wont change i only don't want to hit the disks on every read. i'll know when files change do still think it will cause trouble? |
| 09:14 | Chouser | I guess if you know when the files change and clear caches as appropriate, that would count as using with care. |
| 09:14 | hamza | kk thx. |
| 09:50 | vy | Hi! I've downloaded the shcloj-code.tgz of Programming Clojure and extracted the archive to /tmp/code. Despite I (add-classpath "file:///tmp/code"), (require 'examples.snake) complains that "Could not locate examples/snake__init.class or examples/snake.clj on classpath:". What might I be missing? |
| 09:51 | triyo | Was thinking, is there a way to interface clojurebot with a web front-end? I was thing to build a 'try clojure' page that allows user to try clojure online. |
| 09:52 | triyo | Any suggestions welcome pls. |
| 09:54 | crios | hello vy |
| 09:54 | crios | I also donwloaded those examples, but never used (add-classpath |
| 09:55 | triyo | vy: Where you running the example from? Was you command? |
| 09:56 | triyo | *what's your command you use to run example |
| 09:57 | vy | crios: triyo: I don't use the REPL supplied by shcloj-code.tgz, I've my own emacs+SLIME setup for Clojure. I just want to introduce the related classpath on the fly. |
| 09:57 | vy | triyo: Here is the related ps afx line: "/home/vy/usr/java/jdk/1.6.0_16/bin/java -server -classpath /home/vy/projects/clojure/clojure.jar:/home/vy/elisp/swank-clojure/:/home/vy/.clojure/clojure-contrib.jar clojure.main" |
| 09:59 | crios | exist file:///tmp/code/examples/snake ? |
| 10:00 | Chouser | in general, add-classpath is unreliable, though I don't know if that is the problem in this specific case. |
| 10:01 | vy | crios: `ls -l /tmp/code/examples/snake.clj' returns right stuff. |
| 10:04 | dnolen | vy: you need to add paths to your swank-clojure-extra-classpaths in your .emacs file. |
| 10:04 | triyo | That should work, perhaps try load-file |
| 10:05 | dnolen | vy: unfortunately this is not dynamic you'll have to edit your .emacs file and restart Emacs. |
| 10:05 | vy | dnolen: Restarting current clojure session is what I was trying to avoid... |
| 10:05 | triyo | ,(doc load-file) |
| 10:05 | clojurebot | "([name]); Sequentially read and evaluate the set of forms contained in the file." |
| 10:06 | dnolen | vy: add-classpath probably needs to absolute, did you try that? |
| 10:07 | vy | absolute? |
| 10:08 | triyo | You dont have to restart emacs after changing .emacs, you can eval the changes in emacs buffer |
| 10:08 | dnolen | vy: on my machine when I've add-classpath it always "/full/path/to/my/project/folder" |
| 10:08 | dnolen | triyo: no for that particular var, it's a design problem. |
| 10:08 | triyo | vy: try without file:// protocol |
| 10:09 | vy | dnolen: (add-classpath "/tmp/code") => no protocol: /tmp/code |
| 10:09 | triyo | Hehe |
| 10:10 | vy | dnolen: You sure add-classpath works with strings without a protocol? |
| 10:10 | rsynnott | ah, classpaths |
| 10:10 | dnolen | vy: pretty sure at one point I worked on a halfbaked Clojure project management tool and use it that way. |
| 10:11 | triyo | ,(doc add-classpath) |
| 10:11 | clojurebot | "([url]); Adds the url (String or URL object) to the classpath per URLClassLoader.addURL" |
| 10:11 | Chouser | rsynnott: yes |
| 10:11 | dnolen | vy: OOPS. just check my code, you do need the protocol. |
| 10:12 | dnolen | when in doubt check the code :) |
| 10:13 | ngoc | hi, does clojure have light-weight thread? or does it use normal java's thread? I heard that agent uses some kind of thread pool |
| 10:14 | Chouser | ngoc: Clojure uses Java threads which are usually full OS threads. |
| 10:14 | triyo | rsynnott: Totally agree. I've worked on java ee and app specs never defined the way classloaders should load classes. So all app servers picked their own way of dealing with classloadig concerns. |
| 10:15 | Chouser | ngoc: but an agent is not a thread -- agents are assigned to threads from a pool as needed to get work done. So having a very large number of agents is cheap. |
| 10:17 | ngoc | I come to clojure from erlang. it seems that clojure focuses on data, while erlang focuses on processes |
| 10:18 | Chouser | ngoc: that's an interesting summary. |
| 10:19 | ngoc | in erlang I can wrap a variable inside a process (like state in gen_server), then when I want to create an instance of the variable, I will create an instance of the process |
| 10:19 | Chouser | one might also argue that Clojure focuses on functions. |
| 10:19 | ngoc | is there any way to create instance of agent in clojure? in the feeling of erlang's gen_server? |
| 10:20 | Chouser | an agent is a "variable". That is, an agent has a state, and you can change that state by sending it an action or task. |
| 10:21 | Chouser | but especially since you're coming from Erlang, beware or over-using agents. Clojure has several other concurrency mechanisms that may work better in certain cases. |
| 10:24 | dnolen | vy: for what it's worth I just tried a quick test myself of add-classpath and it just worked. |
| 10:24 | ngoc | For example, I want to create a tictactoe game. A game has many rooms. In Erlang I would model the game room into a gen_server which has state. When I want to create a new room I would spawn a gen_server instance. This way each room's state is wrapped inside a gen_server. |
| 10:24 | ngoc | How can I do this in Clojure? |
| 10:26 | ngoc | I think I will have to create a thread and wrap an agent inside that thread. Is this the right way to do? |
| 10:26 | stuartsierra | I would just use a function that returns a new agent each time it's called. |
| 10:27 | Chouser | ngoc: each room is an identifiable thing regardless of its state, right? So those would be some kind of reference object, probably a ref or agent. The state of a room at any moment would be the current board, whose turn it is, etc. all stored in a collection object, probably a map |
| 10:29 | Fossi | having done my share of erlang and clojure, i don't see where gen-server or agents come into play |
| 10:29 | ngoc | Ah, then all room should be put to a map of :room-id => agent, right? |
| 10:30 | Fossi | then, i don't really understand what a 'room' is, so that might be the problem |
| 10:30 | Chouser | ngoc: sure, and if you want that map to be global and change over time, that whole map could also be in a reference type |
| 10:31 | Chouser | (def all-rooms (ref {:the-first-room (ref {:turn :player-1 :board '[x o o, o x - ...] ... |
| 10:31 | ngoc | That's what I mean "data". How about code? When a player make a move, how to make the room "react"? |
| 10:33 | ngoc | Fossi: a room is a thing that has a state and some code attached to it |
| 10:34 | Chouser | (alter (:the-first-room @all-rooms) apply-players-move the-move) |
| 10:34 | Fossi | i'd argue that that's a bad (unpure) construct in most cases |
| 10:34 | Chouser | where the-move would be the user's input, and apply-players-move a function that takes an old room-state and the player's input and returns a new room-state |
| 10:34 | Fossi | i understand it from a message passing point of view, but i rarely find myself modelling things like that in clojure. |
| 10:35 | Fossi | might be related to my clojure problem-domain though |
| 10:35 | Chouser | that function could also do end-of-game checking and such. That's where most of your logic will live and should be a pure function. |
| 10:35 | Chouser | As such, apply-players-move will be easy to test at the repl or in unit tests, etc. |
| 10:36 | Chouser | ...and completely thread safe, so you can spawn as many threads as needed to process incoming player moves. |
| 10:39 | ngoc | Can the pattern be generalized like this: (1) create a central variable, (2) when some event happens, call a central code to modify the central variable? |
| 10:41 | ngoc | Does the central variable become the bottle neck: all threads must do some kind of locking on this variable? |
| 10:41 | ngoc | If there are tens of thousands of players, the variable will become the bottle neck? |
| 10:42 | Chouser | (1) design a structure of data to hold the kind of data your app needs (2) write pure functions to manipulate that type of data in useful ways (3) decide what kinds of identity or reference objects will be holding that kind of state |
| 10:43 | Chouser | ngoc: each room in my example was a ref, which can only be changed in a transaction. If a thread has a transaction that only touches one ref (one room) it will not have to wait on threads touching other refs. |
| 10:44 | Chouser | ngoc: an alternative would be for each room to be an agent. when you send the agent a task, it'll get a thread assigned to do that work which will then also be able to proceed without waiting on any other threads that may or may not be working on other rooms. |
| 10:45 | Chouser | so in short: no bottleneck. |
| 10:45 | Chouser | the top level map of rooms is a single thing so if lots of threads try to add or remove rooms at the same time, they would have to line up, so there could be a bottleneck there. |
| 10:46 | Chouser | if that's a actual problem, you'd split that up so you don't have a single map of rooms -- partition it across multiple mutable reference objects somehow. |
| 10:48 | ngoc | Is there a way to map a room name like "room1" (for example a string) to a ref that floats somewhere in the JVM? This way when I have a name, I will be able to get back the ref? |
| 10:49 | stuartsierra | Sure, just define a var. |
| 10:49 | ngoc | I mean when all the refs are not put inside a single collection to avoid bottle neck... |
| 10:49 | Chouser | I don't think so. Things floating around tend to get garbage collected. Something needs to act as the root and provide the mapping from name to ref. |
| 10:50 | triyo | A map of refs perhaps then you can lookup re by :key |
| 10:50 | rhickey | j.u.c.ConcurrentHashMap is a fine place to put a top-level registry of refs, if all you'll ever do is add/remove/lookup by single key |
| 10:52 | ngoc | Is map in Clojure the same as ConcurrentHashMap? Or do I have to use ConcurrentHashMap explicitly? |
| 10:52 | stuartsierra | rhickey: is a namespace basically a ConcurrentHashMap of vars? |
| 10:52 | Chouser | ngoc: the latter |
| 10:53 | hiredman | rhickey: what do you think about lifting Agent.Action out into AAction and IAction and providing some indirection in Agent so it is easy to proxy Agent with a custom Action |
| 10:53 | Chouser | stuartsierra: the list of namespaces is a ConcurrentHashMap |
| 10:53 | rhickey | one way to think about j.u.c. maps is: they are to refs-to-persistent-strucutres as atoms are to refs, only supporting atomic non-coordinated access, but more concurrency than putting a persistent structure in an atom |
| 10:54 | Chouser | stuartsierra: each namespace is basically (atom {}) |
| 10:54 | rhickey | namespaces use both strrategies |
| 10:54 | stuartsierra | ok |
| 10:55 | rhickey | the biggest difference being you can get a snapshot of a pds in an atom easily, can never get one from the j.u.c. stuff |
| 10:55 | rhickey | j.u.c. collections make good caches/registries |
| 10:56 | rhickey | i.e. single lookup vs really treating the collection as a value |
| 10:57 | ngoc | I have another question. How to have a timeout callback? For example the callback function will be called after 30s of room inactivity? |
| 10:57 | rhickey | hiredman: custom action that does what? |
| 11:05 | ngoc | I feel that Java thread must be used to create this timeout effect. But the problem is not too many threads can be created in JVM. Is there a solution? |
| 11:05 | stuartsierra | ngoc: java has a Timer class that does this |
| 11:06 | mccraig | is there a destructuring way of defaulting an optional parameters value ? |
| 11:09 | dnolen | mccraig: have you looked at clojure.contrib.def defnk, it's pretty handy. |
| 11:11 | drewr | +1 |
| 11:12 | mccraig | that should do the trick. thx |
| 11:16 | Chouser | ngoc: java.util.Timer allows you to schedule multiple events in a single thread |
| 11:33 | Chouser | is there a way to do an unsigned-bit-shift-right? |
| 11:36 | ngoc | The doc of java.util.Timer says "Timer tasks should complete quickly. If a timer task takes excessive time to complete, it "hogs" the timer's task execution thread. This can, in turn, delay the execution of subsequent tasks, which may "bunch up" and execute in rapid succession when (and if) the offending task finally completes." I think this single thread implementation is not good. |
| 11:37 | Chouser | ngoc: that's your call of course. I think if your timer tasks simply send off agents you'll probably be fine. |
| 11:37 | ngoc | Ah, what a trick! |
| 11:40 | cgrand | Chouser: no |
| 11:40 | ngoc | In the API (http://clojure.org/api) I see there are some "shift" functions |
| 11:41 | ngoc | Can't (bit-shift-right x n) be used? |
| 11:41 | Chouser | ,(bit-shift-right -12345 8) |
| 11:41 | clojurebot | -49 |
| 11:42 | Chouser | anyway, I think I have a sufficient work-around here. |
| 11:42 | tmountain | Chouser: is this helpful? http://www.mail-archive.com/clojure@googlegroups.com/msg13789.html |
| 11:43 | Chouser | tmountain: ah, that's what I was doing. But that post gives me confidence I'm doing the right thing, thanks! |
| 11:43 | tmountain | Chouser: happy to help |
| 12:04 | mtm | is there any work in progress to to enhance 'memoize'? I've got a few ideas but didn't want to reinvent the wheel |
| 12:04 | ambient | how can it be enhanced? |
| 12:05 | mtm | right now, the cache can grow without bound |
| 12:05 | mtm | also, it holds a strong reference to the return value |
| 12:05 | ambient | news for me, i thought it had a bound |
| 12:05 | mtm | nope |
| 12:06 | hiredman | mtm: it's been discussed here in the paste |
| 12:06 | hiredman | past |
| 12:06 | ambient | clojure has weak refs? |
| 12:06 | hiredman | ~logs |
| 12:06 | clojurebot | logs is http://clojure-log.n01se.net/ |
| 12:06 | mtm | thanks, I'll dig into it |
| 12:06 | hiredman | hmm |
| 12:06 | mtm | but, yes, I'd like to use weak refs in the cache |
| 12:07 | Chouser | ambient: java has weak references, so yes |
| 12:07 | mtm | or, at least, be able to pass in a user defined cache |
| 12:07 | Chouser | I don't know that weak references would always be appropriate for a memoize fn |
| 12:07 | hiredman | for example around 2009:Aug:30:08:55:07 PDT |
| 12:07 | hiredman | you'll to translate to the timezone the logs are from |
| 12:07 | mtm | if not weak refs then at least an LRU cache |
| 12:08 | cgrand | it doesn't fit every case but I like (binding [foo (memoize foo)] (some code)) |
| 12:08 | Chouser | cgrand: oh, that's interesting. |
| 12:09 | mtm | cgrand: I like it |
| 12:09 | Chouser | but some takes 2 args |
| 12:10 | hiredman | http://clojure-log.n01se.net/date/2009-08-30.html#11:51 |
| 12:11 | mtm | it just seems you have to be really careful with memoize: it's pretty easy to have it retain the head of sequence |
| 12:13 | mtm | hiredman: thanks, reading it now |
| 12:14 | Chouser | anyone know how to get the pid of the current process? |
| 12:16 | mtm | I wasn't thinking of using a WeakHashMap; that only uses weak refs for the keys |
| 12:16 | stuartsierra | Chouser: there are ways to do it in Sun Java |
| 12:16 | Chouser | hm. or with jna I suppose. |
| 12:17 | stuartsierra | yeah, nothing in the standard JDK |
| 12:17 | Chouser | ok, thanks. |
| 12:20 | Chouser | (.invoke (com.sun.jna.Function/getFunction "c" "getpid") Integer nil) |
| 12:33 | hiredman | clojurebot: git 64323d8c6ad4962ac780d4d904b69a891ab312f8 |
| 12:34 | clojurebot | added ->> |
| 12:50 | ngoc | Just a curious question: Java uses camelCase, why Clojure is designed to use hyphen-case? |
| 12:51 | eevar | because clojure is a lisp |
| 12:51 | stuartsierra | tradition, no other reason |
| 12:51 | mabes | ngoc: not a clojure expert by any means, but that is more of clojure's lisp inheritance |
| 12:51 | djpowell | Chouser: this works in practice on Sun's JDK, but it is a hack, and not guaranteed: (-> (java.lang.management.ManagementFactory/getRuntimeMXBean) (.getName) (.replaceAll "@.*" "")) |
| 12:55 | ngoc | Is there any Clojure book to be published in the near future? I don't know Lisp, the current Clojure book looks like only an introduction. |
| 12:57 | ngoc | I read the first chapter: well, this is introduction. Next chapter: oh, still introduction. Next... still introduction... Last chapter... God, still introduction :D |
| 12:58 | crios | +1 ngoc. "Programming Clojure" does not give you the right "mental shift" into Clojure |
| 12:58 | crios | this is my experience |
| 12:58 | lisppaste8 | mtm pasted "pid " at http://paste.lisp.org/display/87654 |
| 12:59 | mtm | it's a bit more portable (though I haven't tried it on windows) |
| 12:59 | djpowell | mtm: I just pasted something similar just above. I can confirm that it works on windows |
| 13:00 | mtm | djpowell: argh1 you beat me to it1 ;) |
| 13:00 | mtm | oops, those 1's were supposed to be !'a (playing with a remapping of my top row on this keyboard) |
| 13:02 | mtm | I can confirm that it also works on OS X |
| 13:03 | mtm | so the only thing left: does it work on Android? |
| 13:03 | rsynnott | does clojure work on android? |
| 13:04 | mtm | I vaguely remember hearing that it did but I can't confirm that |
| 13:04 | stuartsierra | rsynnott: it has been demonstrated to work |
| 13:05 | dnolen | rsynnott: some work has been done on that. check the mailing list. I also think that is the point of clojure-slim.jar |
| 13:06 | hiredman | eh? |
| 13:07 | hiredman | clojure-slim just omits compiled clojure code, certainly not suitable for the android |
| 13:07 | dnolen | hiredman: gotcha. I vaguely remember some patches for dalvik and I thought clojure-slim was related. |
| 13:08 | hiredman | I don't think there have been dalvik specific patches |
| 13:08 | hiredman | just patches to allow for leaving out the dynamic bits |
| 13:08 | hiredman | since code generation doesn't work on android |
| 13:10 | dnolen | hiredman: sounds like patches for dalvik to me ;) but whatever. |
| 13:11 | Chouser | clojurescript has also never supported generating code itself. |
| 13:13 | hiredman | dnolen: it's also useful in places where the security context does not allow for code generation |
| 13:15 | dnolen | hiredman: i see. |
| 13:17 | ngoc | Why "some" form does not have question mark ("some?")? Why there is "not-any?" but there is no "any?"? |
| 13:17 | ngoc | (Just a curious question about the API) |
| 13:20 | ngoc | And "some" returns true or nil, not true or false!? |
| 13:20 | stuartsierra | "some" returns the thing that made the predicate true |
| 13:20 | stuartsierra | ,(some #(= 5 %) [1 2 3 4 5 6]) |
| 13:20 | clojurebot | true |
| 13:20 | stuartsierra | no, |
| 13:21 | stuartsierra | It returns the result of the predicate function. |
| 13:21 | stuartsierra | ,(some #(when (= 3 %) "yes") [1 2 3 4 5]) |
| 13:21 | clojurebot | "yes" |
| 13:27 | dnolen | back did I miss anything? |
| 13:27 | dnolen | oops wrong channel :) |
| 13:28 | ngoc | In http://java.ociweb.com/mark/clojure/article.html, (some #(= % "Mark") stooges) should return nil, I have just reported this typo to the author |
| 13:56 | pixelman | Is it possible to make a lazy reverse range? like (range 9000000 1) somehow? |
| 13:59 | tmountain | pixelman: (range 10 1 -1) |
| 14:00 | pixelman | tmountain: thanks!! |
| 14:00 | tmountain | pixelman: np, you know about the doc function right? |
| 14:01 | tmountain | ,(doc range) |
| 14:01 | clojurebot | "([end] [start end] [start end step]); Returns a lazy seq of nums from start (inclusive) to end (exclusive), by step, where start defaults to 0 and step to 1." |
| 14:01 | tmountain | pixelman: pretty handy... I use it constantly |
| 14:01 | pixelman | yep, I just assuemed range would not be able to do it, without looking it up :) |
| 14:02 | pixelman | btw, is there a way I could search and get a list of all functions that works with lists and arrays? |
| 14:06 | Chouser | Sure! But you probably want seq functions too, right? |
| 14:06 | Chouser | (find-doc #"seq|list|array") |
| 14:06 | pixelman | wow. that's great! |
| 14:06 | Chouser | That should keep you busy for a while. ;-) |
| 14:06 | pixelman | awesome. |
| 14:53 | LauJensen | I don't, see you there in a sec |
| 14:58 | LauJensen | Someone asked me on my blog to do a Haskell Vs Clojure piece, but which application space does Haskell cover? |
| 15:06 | ambient | academic study |
| 15:06 | ambient | :p |
| 15:07 | ambient | chouser, you're a better man than I clearly |
| 15:08 | LauJensen | prettier anyway :) |
| 15:08 | Chouser | er |
| 15:08 | LauJensen | This might be a very dumb question, but Haskell has no use in industry ? |
| 15:08 | stuartsierra | not necessarily |
| 15:09 | stuartsierra | I know companies that use OOCaml, for example. |
| 15:09 | Makoryu | LauJensen: Yep, it's only useful for processing li... er, parallel distributed... uhm.... Academia. Yeah, that's it. It's strictly a research language. |
| 15:09 | Makoryu | Haskell is general purpose. |
| 15:10 | Makoryu | There's some company that uses it to make tractors, and of course there are several that write financial apps. |
| 15:10 | LauJensen | haha |
| 15:10 | LauJensen | That was fun Makoryu :) |
| 15:12 | tmountain | LauJensen: there's a book called "Real World Haskell" |
| 15:12 | tmountain | LauJensen: it's an appeal to the world that haskell is useful for things besides quicksort |
| 15:12 | Makoryu | LauJensen: But seriously, the biggest Haskell apps (aside from the compiler, which serves as a back end to a bunch of logic/theorem languages these days) are probably darcs and xmonad |
| 15:12 | tmountain | Makoryu: and pugs... |
| 15:13 | LauJensen | All 3 of which are foreign to me |
| 15:13 | Chouser | I find Haskell to be quite impressive and I hope one day to be smart enough to use it. |
| 15:13 | Makoryu | tmountain: I... can't really vouch for pugs >_> |
| 15:13 | Makoryu | LauJensen: Darcs is a DVCS, and xmonad is a tiling window manager |
| 15:13 | LauJensen | Ok |
| 15:13 | LauJensen | Chouser: What impresses you about iT? |
| 15:13 | tmountain | LauJensen: Pugs is a Perl 6 interpreter |
| 15:14 | sfuentes | i like xmonad |
| 15:14 | ambient | i will be intriqued to use haskell the day someone uses it for actual commercial purposes successfully |
| 15:14 | tmountain | I used xmonad for a bit. It's pretty nice, but it's config file basically scared me away form haskell |
| 15:15 | Chouser | LauJensen: Haskell is succicnt, appears to have a powerful static type system with inference, has good immutable data structures, encourages pure functions... |
| 15:15 | Chouser | in short, it's not PHP |
| 15:16 | tmountain | it also allows oodles of user-defined operators, which makes any new source file completely alien until you determine what the programmer had in mind this time around |
| 15:16 | Chouser | and the people who use it seem to love it. Who loves C++? |
| 15:18 | LauJensen | Chouser, please explain the term 'powerful static type system' |
| 15:18 | ambient | i think C++ is in many cases, the pragmatic choice |
| 15:18 | Makoryu | LauJensen: Haskell has a really nice implementation of parametric polymorphism (generics) |
| 15:18 | tmountain | LauJensen: http://book.realworldhaskell.org/read/types-and-functions.html |
| 15:18 | LauJensen | ambient: pragmatic means "if it works, its good", meaning c++ could never be the pragmatic choise |
| 15:18 | Makoryu | LauJensen: It's statically typed, but it uses whole program type inference so you don't usually have to worry about type declarations |
| 15:18 | ambient | LauJensen most of Googles Code Jam top coders disagree |
| 15:19 | tmountain | haskell is soooo controversial ;-) |
| 15:19 | LauJensen | ambient: that tells you something about them doesn't it? :) |
| 15:19 | LauJensen | Makoryu: Alright |
| 15:19 | Chouser | ambient: yes, people use C++, and perhaps sometimes it's the best choice. But it's been a while since I heard someone who really understands C++ express joy at the idea of using it. |
| 15:19 | ambient | i think C++ is way too convoluted that it's even possible to fully understand it |
| 15:19 | LauJensen | Makoryu: By parametric polymorphism, do you mean overload of functions based on arity ? |
| 15:20 | ambient | personally, im just happy using a simple subset of it |
| 15:20 | Makoryu | LauJensen: No. I mean overloading of functions, data structures, and values based on parameterized types |
| 15:20 | ambient | LauJensen it tells me that they get things done |
| 15:20 | LauJensen | exaple? |
| 15:21 | LauJensen | +m |
| 15:21 | Makoryu | For example, you'll see type signatures like "[b] -> b" which means "A function that takes a parameter of type 'list of b' and returns a value of type 'b'" |
| 15:21 | Makoryu | (Where b can stand for any type) |
| 15:22 | Makoryu | So, this will work on [String], [Int], etc. |
| 15:22 | Makoryu | That's fairly basic |
| 15:22 | manic12 | aren't you glad I'm keeping my mouth shut. |
| 15:23 | LauJensen | manic12: Yes |
| 15:23 | LauJensen | Makoryu: k |
| 15:23 | Makoryu | manic12: About the sinister dangers of static typing? ;) |
| 15:23 | manic12 | no, just in general |
| 15:24 | manic12 | i could go off on that though |
| 15:24 | Makoryu | LauJensen: Okay, something cooler: Numeric literals are overloaded. For example, the token 5 can represent an Int, Integer (ie. a bignum), Float, Double, or anything else that implements the typeclass Num |
| 15:25 | LauJensen | Makoryu: Similar to Clojures automatic Int -> Bigint ? |
| 15:25 | wooby | hi everybody i'm new, i tried to code a solution to a problem from the holloway book from scratch: http://gist.github.com/192966, thanks in advance for ripping it apart ;) |
| 15:25 | Makoryu | LauJensen: For literals alone, yes. |
| 15:26 | Makoryu | LauJensen: Of course, you have to explicitly convert a value of type Int if you want to use it as a value of type Integer :p |
| 15:26 | Makoryu | > [5 :: Int, 5 :: Integer] |
| 15:26 | Makoryu | Hmm, lambdabot's gone |
| 15:26 | Makoryu | Oh, duh, what channel am I in? |
| 15:27 | Makoryu | LauJensen: Anyway, the above line would cause a type error, since lists have to be homogeneous. |
| 15:28 | LauJensen | oh ok |
| 15:29 | Makoryu | I should probably send you to #haskell, by the way, to talk about this |
| 15:29 | Makoryu | I have to leave soon anyway :p |
| 15:30 | LauJensen | Thanks for taking the time |
| 15:30 | Makoryu | No sweat |
| 15:31 | Makoryu | You'll find other #haskell folks equally willing to help, of course... |
| 15:31 | LauJensen | Nice |
| 15:34 | LauJensen | wooby: I don't know the problem description, but are you aware that passing a sec like [:p :h :h :t :h :h] will cause the 2x :h not to be filtered? |
| 15:35 | wooby | LauJensen: yeah, the problem description is to return the number of sub-sequences of a specified type and length |
| 15:35 | wooby | so input like [:p :h :h :t :h :h] should return 2 |
| 15:35 | wooby | given type :h and length 2 |
| 15:37 | LauJensen | ok |
| 15:37 | LauJensen | Then you need to rework it :) |
| 15:38 | wooby | LauJensen: how do you suggest i improve it? |
| 15:39 | LauJensen | Its the partition that's tripping you up, so maybe parse it using take-while and filter those of the length you need |
| 15:40 | wooby | LauJensen: is that a better way to do it? it seems to work |
| 15:41 | LauJensen | That's how I would do it, but it's good that you ask in here, so hopefully other people can chime in as well if they have improvements |
| 15:42 | wooby | i see, thanks |
| 15:45 | miltonsilva | hi! |
| 15:45 | LauJensen | yo |
| 15:45 | miltonsilva | I need some help with a function |
| 15:45 | LauJensen | shoot |
| 15:46 | miltonsilva | (defn calc [nBlocks & inodes] |
| 15:46 | miltonsilva | (let [inodes (if (nil? inodes) (/ nBlocks 8) (first inodes)) |
| 15:46 | miltonsilva | iUsageT (/ inodes 128) |
| 15:46 | miltonsilva | nBData (/ (+ (* 128 (- nBlocks (+ 1 inodes iUsageT))) 4) 129) |
| 15:46 | miltonsilva | freeCT (/ (- nBData 4) 128)] |
| 15:46 | miltonsilva | [inodes nBData freeCT])) |
| 15:46 | Chousuke | hm |
| 15:46 | miltonsilva | hmmm how can I past this in a more readeble maner |
| 15:46 | Chousuke | you should use a pastebin :/ |
| 15:46 | Chousuke | lisppaste8: url |
| 15:46 | lisppaste8 | To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste. |
| 15:46 | miltonsilva | thanks |
| 15:46 | Chousuke | put it there, it'll be easier for us to help |
| 15:47 | lisppaste8 | miltonsilva pasted "untitled" at http://paste.lisp.org/display/87670 |
| 15:48 | Chousuke | to start with, dividing the calculations to multiple lines might make them more readable |
| 15:48 | LauJensen | second, whats it supposed to do exactly? |
| 15:49 | Chousuke | or you might want to make them their own functions |
| 15:49 | miltonsilva | ok, I would like to make this as idiomatic as possible... second is there some func that takes a math expression (infix) and evaluates it? |
| 15:49 | Chousuke | also, mixedCase is not very lispy. you should use hyphenated-names instead :) |
| 15:49 | miltonsilva | it's just |
| 15:49 | miltonsilva | ok ;) good tip |
| 15:51 | Chousuke | what's the iUsageT supposed to mean anyway? |
| 15:51 | miltonsilva | this function is to make some calculations... I need to format a disk (write a formater) and some things depend on others... the inode usage table depends on the number of inodes etc |
| 15:52 | miltonsilva | (actually i'm going to write it in C but I would like to test this function with clojure) |
| 15:52 | Chousuke | but an integer is not an iusagetable? does it signify the count or something? :/ |
| 15:53 | miltonsilva | iusagetable is the size in blocks of the inode usage table |
| 15:54 | Chousuke | and what does nBData signify? |
| 15:54 | miltonsilva | number of blocks for data |
| 15:56 | miltonsilva | you could as well this of it as x y z etc... but some things like the way I verify if inodes were passed, I think theres probably a better way of dealing with arity in this case... |
| 15:58 | Chousuke | hmm, right |
| 15:58 | Chousuke | you could actually override on arity |
| 15:58 | miltonsilva | how do I do that? |
| 16:05 | lisppaste8 | Chousuke annotated #87670 "suggestion" at http://paste.lisp.org/display/87670#1 |
| 16:06 | Chousuke | I didn't change the freeCT name for now though |
| 16:06 | Chousuke | also I forgot to change the name of the first function :P |
| 16:09 | Chousuke | actually it might also help to swap the (* 128 (- blocks (inc (+ inodes iut-blocksize)))) and 4 expressions :) |
| 16:09 | miltonsilva | ahah :) I like it |
| 16:11 | Chousuke | note though that / in Clojure is exact if you're dealing with integers. if you're relying on truncating behaviour I think you need to be explicit |
| 16:11 | Chousuke | ,(/ 3 4) |
| 16:11 | clojurebot | 3/4 |
| 16:13 | miltonsilva | thanks for the tip but, this problem requieres a more complex ajustation system.. |
| 16:14 | manic12 | I know the answer is "it depends", but just to ask the question, what would I use in clojure to represent what I might have used a defvar for in common lisp? (accessible to all threads) an agent? |
| 16:14 | miltonsilva | (in order to maximize the number of free blocks of data) |
| 16:14 | stuartsierra | manic12: any reference type, stored in a var |
| 16:19 | manic12 | use def to create it and def again to change it's state? |
| 16:26 | stuartsierra | no, do (def thing (ref initial-value)) |
| 16:26 | stuartsierra | then change with (dosync (alter/ref-set thing ...))) |
| 16:27 | manic12 | ok |
| 16:27 | Chousuke | if you want something that's not controlled, you can use an atom |
| 17:41 | mtm | any opinions of the book "Let over Lambda"? how much of the content would be relevant to clojure? |
| 17:44 | Chouser | mtm: I've never heard of it, but Common Lisp macros have many similarities with Clojure macros. |
| 17:44 | Chouser | I learned macros in CL with "On Lisp" and most of that knowledge came over pretty cleanly. |
| 17:46 | Chouser | none of the debugging, disassembling, or other CL internals are going to be relevant. |
| 17:49 | mtm | chouser: thanks, I figured most of the CL stuff wouldn't apply, but it's good o know about the macro simularities |
| 17:50 | Chouser | the main difference in the macros themselves are how clojure improves hygene |
| 17:56 | Chousuke | if you come from CL I suppose you'll need to understand the namespace qualifying thing and how to get around it and then you're all set :) |
| 17:59 | mtm | no real CL experience, but in the dim past I played around with a TI Explorer. I have to say clojure is the most fun I've had programming since my FORTH days (and that was 25 years ago) |
| 18:51 | lisppaste8 | hamza pasted "mac to string" at http://paste.lisp.org/display/87683 |
| 18:52 | hamza | hey guys, i am trying to convert a byte array in to mac id string but i get class cast exception? |
| 18:55 | Chousuke | hamza: you're not using reduce correctly there. |
| 18:56 | stuartsierra | the first argument to your fn should be the accumulated return values of the function |
| 18:56 | Chousuke | you might want something like (apply str (map (fn [k v] ...) mac-bytes))) |
| 18:59 | stuartsierra | More likely (apply str (map (fn [v] ...) mac-bytes)) |
| 19:02 | hamza | kk apply worked thx. for reduce i should use one more varible for the accumulation and return that? |
| 19:39 | drhodes | ,(union #{1 2} #{3 4}) |
| 19:39 | clojurebot | java.lang.Exception: Unable to resolve symbol: union in this context |
| 19:40 | mtm | ,(clojure.set/union #{1 2} #{3 4}) |
| 19:40 | clojurebot | #{1 2 3 4} |
| 19:41 | drhodes | thanks mtm |
| 19:41 | mtm | np |
| 19:47 | khora | not trolling, I'm trying to pick a language between Scala and Clojure. What are the advantages of using Clojure over Scala? |
| 19:48 | andrewaclt | khora: There are a lot of blog posts that outline the differences between the two. |
| 19:49 | khora | andrewaclt: the ones I've found had little substance to it |
| 19:51 | hiredman | khora: have you read rhickey's rationale? |
| 19:51 | hiredman | ~why? |
| 19:51 | clojurebot | http://clojure.org/rationale |
| 19:51 | khora | hiredman: no, I didn't |
| 19:53 | hiredman | there are also the intro to clojure videos, in which rhickey mentions a few design decisions that went into the language |
| 19:54 | hiredman | ~blip.tv |
| 19:54 | clojurebot | blip.tv is http://clojure.blip.tv/ |
| 19:55 | khora | hiredman: may I confess you something? |
| 19:55 | hiredman | my standard pitch is "LOOK LOOK, SO AWESOME, CAN'T YOU SEE!?!?!" which doesn't work very well |
| 19:56 | khora | scala syntax makes me want to cry, and I'm sick of OOP. However, Clojure's lack of support for tools really put me off. |
| 19:56 | hiredman | which tools? |
| 19:57 | khora | hiredman: textmate |
| 19:57 | hiredman | oh, uh, well, uh... |
| 19:58 | hiredman | really? textmate? |
| 19:58 | dnolen | khora: why not netbeans+enclojure. can't get more user friendly than that. |
| 19:58 | slashus2 | khora: Have you tried IDE plugins? enclojure? |
| 19:58 | andrewaclt | hiredman: pretty sure there is a clojure textmate bundle |
| 19:58 | hiredman | I know there is |
| 19:58 | khora | no I didn't try IDEs because I thought they would be overkill for single scripts |
| 19:59 | hiredman | I assumed he is saying the textmate bundle isn't very good |
| 19:59 | andrewaclt | hiredman: sorry that was to khora :) |
| 19:59 | hiredman | ~google textmate clojure bundle |
| 19:59 | clojurebot | First, out of 638 results is: |
| 19:59 | clojurebot | nullstyle's clojure-tmbundle at master - GitHub |
| 19:59 | clojurebot | http://github.com/nullstyle/clojure-tmbundle/tree/master |
| 19:59 | khora | the textmate bundle I found didn't work for me |
| 20:00 | hiredman | clojurebot: vim? |
| 20:00 | clojurebot | Gesundheit! |
| 20:00 | hiredman | bah |
| 20:00 | hiredman | clojurebot: vimclojure |
| 20:00 | clojurebot | vimclojure is http://kotka.de/projects/clojure/vimclojure.html |
| 20:00 | khora | it said that I didn't have clojure installed, then proceeded to install it for me, but next time... same thing |
| 20:00 | hiredman | clojurebot: vim is <reply>http://kotka.de/projects/clojure/vimclojure.html |
| 20:00 | clojurebot | Ack. Ack. |
| 20:01 | ambient | there's also vim plugin for netbeans which is pretty nice :) |
| 20:01 | khora | netbeans+enclojure is the state of the art? |
| 20:01 | hiredman | I installed netbeans once :( |
| 20:01 | hiredman | khora: most here seem to use emacs |
| 20:02 | hiredman | I installed emacs once too :( |
| 20:02 | khora | hiredman: I tried to get imto emacs |
| 20:02 | khora | h |
| 20:02 | khora | hiredman: too much all at once |
| 20:02 | hiredman | anyway, I use vim, it works, and I don't have to think about it |
| 20:03 | khora | hiredman: I may have to use vim too |
| 20:14 | khora | trying to install vimclojure I get an error |
| 20:14 | khora | BUILD FAILED |
| 20:16 | dnolen | khora: netbeans+enclojure = no configuration. you can just start a project, make a script, be done wit it. |
| 20:17 | wavis | i use jedit, which has an edit mode for clojure that is pretty good. http://github.com/djspiewak/jedit-modes/blob/master/clojure.xml |
| 23:24 | hamza | how do i set a field in a class? |
| 23:40 | rboyd | hamza: I think you use set! http://clojure.org/java_interop |