2013-03-25
| 00:17 | wei_ | to answer the above question lein-ring takes an :init function that's great for db connections |
| 00:24 | akhudek | hm, anyone here use perforate? |
| 00:49 | tyler | is there a way to see what lib lein is trying to download a dependency for? |
| 00:52 | akhudek | lein dep :tree |
| 00:52 | akhudek | shows all the deps and their dependencies |
| 00:53 | akhudek | also, if you aren't using it, use lein-pedantic |
| 00:56 | tyler | akhudek: thanks |
| 00:56 | tyler | akhudek: the problem i was running into was it threw an exception before lein deps completed becuase there was o dep in clojars |
| 00:56 | tyler | so the output of :tree would have never been shown |
| 00:57 | akhudek | ah |
| 00:58 | tyler | trying to use aleph but yammer metrics jar is fuqored i think |
| 00:59 | akhudek | tyler: why not http://http-kit.org/ |
| 01:00 | tyler | akhudek: because i never heard of it before? thanks for the link |
| 01:01 | tyler | (inc akhudek) |
| 01:06 | zakwilson | Is there something like subs that can take a negative start? I know it's trivial to write. |
| 01:07 | akhudek | zakwilson: don't think so |
| 01:08 | zakwilson | And so util.clj grows. |
| 01:36 | xeqi | tyler: it wasn't printing out what was missing? can you paste a project.clj that does it? |
| 01:36 | tyler | xeqi: it was user error my bad |
| 01:36 | tyler | typo in project.clj |
| 01:55 | tyler | how do you get a new object in cljs? like a Date with an arg passed into constructor |
| 01:57 | bbloom | same was as in clojure: use the (Date. 123) |
| 01:58 | bbloom | which is just shorthand for (new Date 123) |
| 01:58 | bbloom | although in this case, i guess it's js/Date |
| 01:58 | tyler | ah thnx |
| 01:58 | bbloom | ,(macroexpand '(Date. 123)) |
| 01:58 | clojurebot | (new Date 123) |
| 01:59 | bbloom | but you really want (js/Date. 123) |
| 02:24 | yunfan | i checked an repo and when running lein repl , the dependancies is so crazy, it require soooooooo many |
| 02:58 | tomoj | . |
| 03:05 | Lajjla | tomoj: do you till love me the most |
| 04:16 | robewald | pass |
| 04:37 | borkdude | say I've got this project.clj like here: https://github.com/borkdude/tictactoe/blob/master/project.clj |
| 04:38 | borkdude | I see lib-noir uses a different clojure version, ring version etc, so how do these "conflicts" resolve? |
| 04:38 | borkdude | I mostly copied these settings from a luminus project btw |
| 04:58 | kral | namaste |
| 05:01 | sirup | I keep getting an error about "Can't dynamically bind var: clojure.core/slurp" when I attempt to stub slurp with clojure.contrib.mock. Code + error here: https://gist.github.com/Sirupsen/71924dee7ce92dbcf98a |
| 05:10 | sirup | hmm.. seems to work when I directly depend on org.clojars.echo/test.mock "0.1.2" instead of clojure.contrib and include echo.test.mock |
| 07:29 | bosie | how would i test if a function is lazy |
| 07:30 | bosie | if the operation itself (to retrieve an element) is highly expensive |
| 07:47 | ucb | bosie: I'm curious as to why you need to check this? |
| 07:47 | bosie | ucb: so i know its lazy |
| 07:47 | bosie | ;) |
| 07:47 | marvin2 | Hi, I've clobbered up a namespace and have made a symbol point to a non-standard value; is there any way to get the original binding back? |
| 07:47 | ucb | and what would you do with that knowledge afterwards? I guess I'm saying I'm interested in what you would do with this knowledge |
| 07:48 | bosie | ucb: i would use it accordingly. if i didn't know if map was lazy or not, i would use map very differently |
| 07:49 | ucb | hmm |
| 07:49 | bosie | ucb: since there are plenty of use cases with my function that dont require to realize the entire list |
| 07:49 | ucb | I'm wondering in what cases knowing whether an fn is lazy or not matters much |
| 07:49 | bosie | ucb: it returns a list though |
| 07:50 | bosie | so i would use it like (map #() (my-expensive-function [1 2 3])) |
| 07:50 | magnars_ | ucb: I guess if map was not lazy, you would be more careful about using `take` first. |
| 07:51 | clgv | &(apropos "lazy") |
| 07:51 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: apropos in this context |
| 07:51 | ucb | magnars_: indeed; I'm trouble figuring out why you shouldn't have all things being lazy to begin with |
| 07:51 | ucb | and then ... well, not bother about it |
| 07:51 | bosie | ucb: right but i dont know if my implementation is lazy or not |
| 07:52 | ucb | bosie: so, I'd say that it is if it's a combination of lazy fns |
| 07:52 | clgv | bosie: you can test the return value of a function if it is a clojure.lang.LazySeq via instance? |
| 07:53 | bosie | hm |
| 07:53 | bosie | k |
| 07:54 | clgv | &(instance? clojure.lang.LazySeq (map inc (range))) |
| 07:54 | lazybot | ⇒ true |
| 07:55 | bosie | thank you, will try |
| 08:18 | squidz | im trying to use dommy which is like hiccup for clojurescript, but am confused how I am supposed render the created html. This may be javascript specific, but if anybody could guide me, id be thankful |
| 08:32 | SonderbladeWork | why doesnt this work? (map #({:x %}) [1 2 3]) |
| 08:35 | Anderken1 | SonderbladeWork: because #({:x %}) means (fn [v] ({:x v})) - you're calling the map |
| 08:44 | clgv | SonderbladeWork: use #(hash-map :x %) instead |
| 08:44 | clgv | &(map #(hash-map :x %) [1 2 3]) |
| 08:44 | lazybot | ⇒ ({:x 1} {:x 2} {:x 3}) |
| 08:45 | SonderbladeWork | clgv: thanks |
| 08:57 | MikeSeth | for defrecord, is the recommended naming convention CamelCase or something else? |
| 08:59 | augustl | MikeSeth: CamelCase, yeah |
| 09:00 | MikeSeth | thanks |
| 09:39 | jtoy | hi all |
| 09:51 | squidz | whats are the best libs to use If I want to create a single-page-application in clojure? |
| 10:00 | g4mm4 | can anyone recommend a mysql library for clojure? |
| 10:00 | g4mm4 | clojureQL wasnt updated in a while and throws also some errors when requiring |
| 10:01 | squidz | g4mm4: korma |
| 10:01 | g4mm4 | squidz: nice |
| 10:17 | clgv | squidz: ring+compojure |
| 10:22 | MikeSeth | hm, sublime repl keeps hanging |
| 10:33 | squidz | MikeSeth: use emacs |
| 10:34 | clgv | MikeSeth: I think the most supported environments are emacs, vim clojure and eclipse/counterclockwise |
| 10:34 | MikeSeth | yeah, I know |
| 10:34 | MikeSeth | emestee@terminata:~$ wc -l .emacs |
| 10:34 | MikeSeth | 145 .emacs |
| 10:34 | MikeSeth | :P |
| 10:35 | clgv | humm got only 122, might be because I only use it for sbcl atm ;) |
| 10:36 | llambda | stuartsierra: is this totally evil and bad? --> https://www.refheap.com/paste/12919 |
| 10:36 | llambda | arrdem: ^ |
| 10:37 | clgv | llambda: depends what guarantees you want... |
| 10:37 | yogsototh | Hi all. I'd like to take a look at clojure by building a minimal application I'll host on heroku. Is there a standard/recommended way of doing this ? |
| 10:40 | llambda | clgv: okay, so kind of evil? :) |
| 10:40 | clgv | llambda: there are also macros that do a similar aliasing of vars from different namespaces |
| 10:41 | clgv | llambda: midje used something like that (at least until 1.4) |
| 10:42 | llambda | clgv: originally i was going to use a macro, but it didn't seem necessary |
| 10:42 | clgv | llambda: you only need a macro for that task if you want to specify the variable names you want to alias. |
| 10:43 | clgv | llambda: e.g. (alias my.ns var1 var2 ...) |
| 10:44 | stuartsierra | llambda: yes |
| 10:44 | stuartsierra | It breaks identity of Vars. |
| 10:45 | clgv | stuartsierra: is there something preventing true "reference variables" to be used for API namespaces? |
| 10:46 | stuartsierra | clgv: I don't understand the question. |
| 10:48 | clgv | stuartsierra: I mean code like the one from llambda usually occurs when someone wants to build an API namespace that exposes all functions an external use wants to use. so in this namespace you often just want to build an alias to a function in a nested implementation namespace |
| 10:48 | clgv | *external user |
| 10:48 | stuartsierra | Why not just have one namespace? |
| 10:50 | clgv | stuartsierra: most likely to separate different concerns |
| 10:50 | stuartsierra | Namespaces are just that, a space for names. If you want the whole API available as one set of names, then it's one namespace. |
| 10:50 | clgv | I mean the implementation of those if you have a small API but larger implementations behind it |
| 10:51 | clgv | stuartsierra: I noticed that for example midje did aliasing that way to build "midje.sweet" |
| 10:51 | llambda | clgv: that's exactly why i'm doing it |
| 10:52 | stuartsierra | I can't comment on Midje, haven't used it much. |
| 10:52 | llambda | it seems like i'm "doing it wrong" tho :) |
| 10:52 | llambda | i'm coming from python, so that's probably why my brain is tainted |
| 10:52 | clgv | In my projects I did need something like such an alias only once yet. so I cannot argue that much for it. |
| 10:53 | llambda | i'm trying to avoid writing the same set of functions twice |
| 10:53 | stuartsierra | Namespaces are not equivalent to modules in the Python sense. |
| 10:53 | llambda | yeah i'm realizing that more and more, stuartsierra |
| 10:53 | stuartsierra | Clojure really doesn't have modules in that sense. |
| 10:53 | llambda | i miss my modules |
| 10:54 | stuartsierra | Namespaces are only there prevent symbols from clashing. Nothing more. How you structure your code is up to you. |
| 10:54 | llambda | stuartsierra: what if i wanted to "import" these http functions from the library i'm wrapping? |
| 10:54 | stuartsierra | Don't. |
| 10:54 | llambda | it's basically just HTTP verbs wrapped around a central "request" function (which i'm redefining) |
| 10:55 | llambda | so the best practice is to write the same set of functions twice, in this case? |
| 10:55 | stuartsierra | If you're changing the definitions to be specific to your library, then yes. |
| 10:55 | llambda | twice in my library, i mean |
| 10:56 | llambda | well i don't mean twice in the sense, once in their library, once in mine: it will happen twice in my library between the oauth1 and oauth2 namespaces |
| 10:56 | stuartsierra | If they're the same, then define them in one place and make that namespace part of your public API. |
| 10:56 | llambda | okay |
| 10:56 | llambda | e.g. if it were a "client" namespace? |
| 10:56 | llambda | the HTTP functions could live there |
| 10:57 | llambda | and then the library could be used by requiring the proper oauth namespace and the client namespace |
| 10:57 | stuartsierra | sure |
| 10:57 | llambda | all right |
| 10:57 | llambda | i can do that |
| 10:57 | gfrederi1ks | I'm having trouble with streaming JSON as a ring response |
| 10:57 | llambda | i just assumed oauth2/get oauth1/post, etc would make for a more user-friendly api |
| 10:58 | llambda | thanks for indulding my incompetence :) |
| 11:00 | stuartsierra | Your users will thank you in the long run if you keep your code as simple as possible and don't play tricks with Vars. :) |
| 11:05 | llambda | stuartsierra: that sounds like sane advice to me :) |
| 11:10 | gfrederi1ks | if I want to stream data into a ring response from another thread I have the issue of handling errors -- having already returned a 200 to the ring adapter, when something goes wrong on the streaming thread I don't know how to turn the response into a 500 |
| 11:11 | pl6306 | Hello, I am new clojure user. Is this the right place to ask questions on how to use it? |
| 11:12 | gfredericks | pl6306: yes |
| 11:12 | pl6306 | I am looking at this function (defn log->list ...) what does "->" mean? |
| 11:13 | gfredericks | it's just a naming convention |
| 11:13 | gfredericks | usually A->B suggests the function converts an A to a B |
| 11:13 | gfredericks | -> is a legal part of the naming syntax |
| 11:13 | pl6306 | got it so it just part of a name |
| 11:13 | gfredericks | yep |
| 11:13 | pl6306 | Thanks! |
| 11:13 | gfredericks | np |
| 11:21 | MikeSeth | will require and friends compile the lib on the fly? |
| 11:22 | gfredericks | if they haven't been AOT'd, yes |
| 11:24 | MikeSeth | ahhh |
| 11:25 | MikeSeth | sorry, rtfm'ing |
| 11:30 | papachan | hello |
| 11:30 | papachan | i am trying to do an import of my file into REPL |
| 11:30 | papachan | but i have a ClassNotFoundException com.clojurebook.CustomException java.net.URLClassLoader$1.run (URLClassLoader.java:366) |
| 11:30 | papachan | my start project is like this |
| 11:30 | papachan | http://paste.ubuntu.com/5646655/ |
| 11:31 | Anderken1 | papachan: you did not add . to the classpath |
| 11:31 | gfredericks | papachan: your classpath doesn't include the root dir |
| 11:32 | Anderkent | I strongly recommend picking up lein so that you don't have to worry about the classpath |
| 11:32 | Anderkent | that or mvn, but lein is much easier to get started with |
| 11:34 | papachan | oh yes i use lein and it work |
| 11:35 | papachan | but i want to import simply my class into REPL |
| 11:35 | papachan | will try to not include . |
| 11:36 | papachan | ok |
| 11:38 | papachan | tried: java -cp ./clojure-1.4.0.jar clojure.main -r . |
| 11:38 | gfredericks | you want -cp .:./clojure-1.4.0.jar |
| 11:41 | papachan | ok i uderstance |
| 11:43 | clgv | -cp .:clojure-1.4.0.jar even ;) |
| 11:46 | Anderkent | Is there an idiom for dynamically selecting which namespace to use depending on some state? I'd rather avoid having to use protocols or multimethods, what I have is two namespaces with the same signatures, and one wrapping ns that delegates to one of these : (if (is-live?) (real-ns/do-stuff) (fake-ns/do-stuff)) |
| 11:49 | noidi | Anderkent, what you probably want is protocols and polymorphism |
| 11:49 | TimMc | No, it sounds like situational polymorphism, not data polymorphism. |
| 11:49 | noidi | then you can configure which protocol implementation to use based on the state |
| 11:50 | Anderkent | eh, I was hoping I could use a ns like an object, but guess not. |
| 11:50 | TimMc | (I'm just making up jargon here.) |
| 11:50 | noidi | protocols are the closest you can get to a first-class namespace in clojure |
| 11:51 | clgv | TimMc: you do that often lately ;) |
| 11:51 | Anderkent | noidi: yes, but they're too annoying to work with, esp for such uncomplicated problem |
| 11:51 | MikeSeth | for (defrecord Foo) Foo is an internet symbol that is not a var, correct? |
| 11:51 | MikeSeth | interned* |
| 11:52 | TimMc | clgv: It's on account of my getting old and decrepit. |
| 11:52 | Anderkent | I want dependency injection :P |
| 11:52 | clgv | TimMc: had to look up that last word - decrepit ;) |
| 11:53 | clgv | MikeSeth: it'll be a class that defrecord statement generates |
| 11:53 | papachan | thanks it work fine with my classes folder |
| 11:53 | clgv | Anderkent: first-class functions ;) |
| 11:53 | MikeSeth | clgv: ah |
| 11:54 | noidi | MikeSeth, interning means creating a var for a symbol |
| 11:54 | MikeSeth | clgv: so I need to use import if I want to use it in another namespace? |
| 11:54 | TimMc | noidi: No it doesn't. |
| 11:54 | clgv | MikeSeth: right. better use the automatically generated constructor function "->Foo" |
| 11:54 | MikeSeth | oh, that is new then |
| 11:54 | noidi | TimMc, ok, looking up or creating :) http://clojuredocs.org/clojure_core/1.2.0/clojure.core/intern |
| 11:55 | clgv | clojure 1.4 (or maybe 1.3 already...) |
| 11:55 | TimMc | noidi: Oh, by "interning" you mean "using clojure.core/intern"? Sure. |
| 11:55 | MikeSeth | thanks! |
| 11:55 | TimMc | Interning in general has nothing to do with Clojure. |
| 11:58 | MikeSeth | Oh, I finally get it |
| 12:02 | jtoy | if I include a namespace that has a method and then do (resolve (read-string "my_fn_from_other_ns")) it returns nil |
| 12:02 | jtoy | why cant i resolve it? |
| 12:03 | gfredericks | how did you "include" it? |
| 12:04 | jtoy | gfredericks: (use 'interests.enrichments) |
| 12:04 | TimMc | 25 cents on Gilardi Scenario |
| 12:05 | gfredericks | I'll take that bet |
| 12:05 | gfredericks | however I don't know why it's not working |
| 12:06 | gfredericks | presumably it's some detail you're not mentioning because it didn't occur to you it might be a problem |
| 12:06 | TimMc | jtoy: Is this in the REPL? |
| 12:06 | jtoy | TimMc: yes |
| 12:07 | jtoy | TimMc: in code I do (:use [interests.enrichments]) |
| 12:07 | jtoy | I think I see |
| 12:12 | TimMc | jtoy: The :use is in your ns statement? |
| 12:26 | gfredericks | would it be reasonable for a lein plugin to hook the 'jar' task and do some git introspection and write a `git-commit.sha` file to /resources? |
| 12:27 | TimMc | Sounds good. |
| 12:28 | TimMc | gfredericks: But bonus points if you can create that file in the commit the jar is based on by achieving a hash collision. |
| 12:29 | gfredericks | huh; leiningen.pom/read-git-head seems to exist |
| 12:29 | technomancy_ | gfredericks: you can add :filespecs to project.clj that can have arbitrary bytes or paths |
| 12:29 | technomancy_ | see `lein help sample` |
| 12:30 | gfredericks | technomancy: I saw that recently; it's not clear to me exactly what that means or how I would use it |
| 12:30 | technomancy | yeah it's not a very good interface |
| 12:30 | technomancy | will be rewritten from scratch for 3.0 |
| 12:33 | Sonderblade | how do you get the first/any item in a map in clojure? |
| 12:33 | technomancy | Sonderblade: you can't |
| 12:34 | technomancy | maps aren't ordered |
| 12:34 | technomancy | err--you can't get first; you will get an arbitrary k/v pair using clojure.core/first |
| 12:35 | hyPiRion | ,(first (sorted-map 3 :third 1 :second 0 [:first])) |
| 12:35 | clgv | Sonderblade: since maps are seqable you can do the following, but there is no guarantee on the order ##(first {:a 1 :b 2}) |
| 12:35 | lazybot | ⇒ [:a 1] |
| 12:35 | clojurebot | [0 [:first]] |
| 12:35 | hyPiRion | But I suspect you don't want the sorted-ability. Though it's nice to know about. |
| 12:36 | Sonderblade | i know maps are not ordered i just want any |
| 12:40 | dnolen | Sonderblade: first does what you want |
| 12:41 | kalasjohnny2000 | &join #devops |
| 12:41 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: join in this context |
| 12:41 | kalasjohnny2000 | sry |
| 12:41 | hyPiRion | heheh |
| 12:43 | kalasjohnny2000 | talking about it, what's the most decent way to make a git push and the branch gets into a stage environment? |
| 12:43 | kalasjohnny2000 | like heroku does, but on my own server... |
| 12:43 | kalasjohnny2000 | I did try with git hooks, but it feels a bit shakey. |
| 12:45 | kalasjohnny2000 | is jenkins the way to go? |
| 12:45 | nDuff | kalasjohnny2000: *shrug*. Are you already using any ops-automation tooling? |
| 12:45 | nDuff | kalasjohnny2000: ...if you're already a Pallet, Chef or Puppet shop, then it makes sense to leverage that. |
| 12:45 | kalasjohnny2000 | @nDuff pallet would be the most reasonable, yes. |
| 12:46 | nDuff | ...then you can push out config changes with the same infrastructure you use for code changes. |
| 12:46 | kalasjohnny2000 | that's what I want, yes. What is the best... crate... for this? |
| 12:47 | pl6306 | What does "->" mean in (-> "http://nytimes.com" java.net.URL. .openConnection)? I would google it but "->" doesn't produce any good search results. |
| 12:47 | kalasjohnny2000 | @pl6306 -> means "take the object coming afterwards and apply all the functions after it" |
| 12:47 | yacin_ | ,(-> [[1 2] 3 4] first first) |
| 12:48 | clojurebot | 1 |
| 12:48 | yacin_ | ,(-> [[1 2] 3 4] first second) |
| 12:48 | clojurebot | 2 |
| 12:48 | kalasjohnny2000 | @pl6306 http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/-%3E |
| 12:48 | pl6306 | Thanks! |
| 12:49 | nDuff | kalasjohnny2000: Actually -- not in a great position to tell you, there. My personal experience is mostly with Chef; Pallet looks like 0.8 will finally be fitting the bill re: most of my use cases, but it wasn't quite baked for what I needed in the past. |
| 12:49 | dnolen | pl6306: it's important to note that -> is a macro, it just transforms the syntax |
| 12:50 | tbatchelli_m | kalasjohnny2000: you can always drop by #pallet and ask |
| 12:51 | kalasjohnny2000 | thank you both of you, @nDuff and @tbatchelli_m :) |
| 13:05 | borkdude | Is there a name for apps built with ring, compojure, lib-noir and hiccup? I suggest: Hiricono apps. Say yes to Hiricono! Or Ricono if you don't use hiccup. |
| 13:09 | borkdude | lol, I just made this up while biking home, sorry |
| 13:09 | jeremyheiler | lol nice |
| 13:10 | ejackson | bokdude: or orinoco |
| 13:11 | borkdude | ejackson nice |
| 13:13 | borkdude | maybe Luminus should be renamed to Orinoco, I wouldn't mind ;) |
| 13:13 | borkdude | unless there is some nice reasoning behind "Luminus" |
| 13:51 | gfredericks | technomancy: using the private leiningen.pom/read-git-head for getting the commit is a bad idea? |
| 13:51 | technomancy | gfredericks: the jar contains the pom with the tag; can you just get it from there? |
| 13:53 | gfredericks | from META-INF/maven/group/artifact/pom.xml? |
| 13:54 | technomancy | sure |
| 13:54 | technomancy | also pom.properties if you don't feel like busting out a parser |
| 13:54 | gfredericks | you correctly guessed whether or not I felt like busting out a parser! |
| 13:55 | technomancy | I suspect you'd much rather bust out some sick rhymes about XML. |
| 13:56 | gfredericks | though to be fair, I probably would have just used a regex. I wonder how many problems I would hava had at that point. |
| 13:56 | TimMc | 7 |
| 13:58 | SegFaultAX | technomancy: That's awesome. |
| 13:58 | gfredericks | technomancy: so it'd be hard to write a general lib for reading this due to having to know the group/artifact to get the path, eh? |
| 14:00 | technomancy | (be sure to visit http://nedroid.com for more lulz) |
| 14:00 | TimMc | Nedroid has quite a few of the lulz. |
| 14:00 | technomancy | gfredericks: well every lein-produced jar will have a pom.properties on the classpath, yeah |
| 14:03 | jcromartie | *phew* I just solved my JSON dilemma |
| 14:04 | jcromartie | create my.project.json namespace with encode and decode functions that wrap whatever lib I decide to use tomorrow :) |
| 14:05 | dakrone_ | jcromartie: yes, that is always a good idea |
| 14:05 | jcromartie | I think clojure.data.json has the best API, honestly… the :key-fn and :value-fn are just about the simplest solution possible |
| 14:05 | jcromartie | no multimethods, or installing handlers, or maps of types to functions |
| 14:05 | jcromartie | functions! |
| 14:05 | jcromartie | what a concept ;) |
| 14:26 | patbrown | Does anyone know the significance of #_(function)? For instance in the pedestal.io user.clj file found here https://github.com/pedestal/pedestal/blob/master/service-template/src/leiningen/new/pedestal_service/user.clj |
| 14:26 | patbrown | More specifically, what's the underscore for? |
| 14:26 | arkx | It's a comment |
| 14:26 | tbaldridge | The reader drops whatever is next |
| 14:26 | SegFaultAX | patbrown: It comments out the next form. |
| 14:26 | Anderkent | patbrown: #_ is a reader macro that ignores the next form |
| 14:27 | TimMc | ,[1 #_ 2 3] |
| 14:27 | clojurebot | [1 3] |
| 14:27 | TimMc | patbrown: ^ |
| 14:27 | tbaldridge | compare to: |
| 14:28 | SegFaultAX | patbrown: http://clojure.org/reader |
| 14:28 | tbaldridge | ,[1 (comment 2) 3] |
| 14:28 | clojurebot | [1 nil 3] |
| 14:28 | patbrown | So, the only reason to use it in this instance is for terseness? |
| 14:28 | TimMc | patbrown: No, the point is that those are different. |
| 14:28 | TimMc | [1 nil 3] is not [1 3] |
| 14:29 | patbrown | Oh, so you use it, so you don't return a nil? |
| 14:29 | tbaldridge | patbrown: in your example from pedestal, the function now returns the result of the call to in-ns, instead of just returning null |
| 14:29 | tbaldridge | *nil |
| 14:29 | SegFaultAX | patbrown: No. You use it when you want to comment out a form. |
| 14:29 | SegFaultAX | ,(+ 1 #_ 2 3) |
| 14:29 | clojurebot | 4 |
| 14:30 | TimMc | It's pretty rare to see anyone use the comment macro. |
| 14:30 | SegFaultAX | ,(+ 1 (comment 2) 3) |
| 14:30 | clojurebot | #<NullPointerException java.lang.NullPointerException> |
| 14:30 | tbaldridge | except for Rich :-P |
| 14:30 | TimMc | What you'll sometimes see is this: |
| 14:30 | SegFaultAX | patbrown: Note that when the first of those forms is evaluated, it's like the 2 isn't even there. |
| 14:30 | TimMc | ,[1 #_(comment 2 3 4 5) 6] |
| 14:30 | clojurebot | [1 6] |
| 14:31 | TimMc | (since #_ only takes out one form) |
| 14:31 | TimMc | .[1 #_2 #_3 #_4 #_5 6] is more annoying to type |
| 14:31 | TimMc | ,[1 #_2 #_3 #_4 #_5 6] that is |
| 14:31 | clojurebot | [1 6] |
| 14:31 | SegFaultAX | TimMc: Although that gives me some fun ideas for code obfuscation :) |
| 14:32 | SegFaultAX | Make it as hard as possible to determine which forms are actually evaluated. |
| 14:32 | TimMc | SegFaultAX: #_ can also stack, if you want obfuscation. |
| 14:32 | TimMc | ,[1 #_#_#_#_ 2 3 4 5 6] |
| 14:32 | clojurebot | [1 6] |
| 14:33 | SegFaultAX | Wow, I didn't know that. |
| 14:33 | Glenjamin | hi guys, is there a common idiom to take an input stream and read it into a byte array? |
| 14:33 | TimMc | and it does weird things to anon fn args |
| 14:33 | patbrown | I just read the definition in the linked reader page. I'm still a little lost as to the practical usage of it. I stumbled across this because I'm working on conditioning my repl for cljs development. Is there any reason why in pedestal they load up a dev namespace instead of using a function to load code into the user namespace? |
| 14:34 | SegFaultAX | patbrown: In the case of the code you linked, they probably did it that way because you don't need to actually refer to anything inside the dev namespace. |
| 14:35 | SegFaultAX | It's purely for testing or development or whatever. |
| 14:35 | SegFaultAX | patbrown: That form is commented out because they don't want to call dev/start when that dev function is run. |
| 14:36 | patbrown | Why put it in there at all then? |
| 14:36 | tbaldridge | maybe because it's alpha code? |
| 14:37 | patbrown | Just like with the clojurescript one project, the boys at relevance do things way differently than I see anyone else do them. |
| 14:37 | SegFaultAX | That code is still highly active. |
| 14:37 | patbrown | My questions have been answered, thanks. Reader macros are an interesting part of clojure I've yet to explore. |
| 14:38 | technomancy | I put in comments to do things like launching a dev jetty into production code |
| 14:39 | TimMc | patbrown: If you use #_ instead of ;; you can provide (well-formed) code samples in a way that your editor will syntax-highlight them. :-) |
| 14:39 | patbrown | That's the rub I gather. |
| 14:39 | SegFaultAX | I find ;; to be mostly useless. |
| 14:40 | TimMc | It's also a way to comment out a multiple-line expression. |
| 14:40 | hyPiRion | ,(let [a 10] (inc a) #_=> 11) ;) |
| 14:40 | clojurebot | 11 |
| 14:40 | patbrown | It just looks better and it doesn't return nil, still giving you proper repl feedback |
| 14:41 | TimMc | hyPiRion: Awful/ |
| 14:41 | TimMc | ,(let [a 10] (inc a) #_=> 'eleventy) :-( |
| 14:41 | clojurebot | eleventy |
| 14:41 | SegFaultAX | I prefer "threeve" |
| 14:42 | jro_ | when I run lein repl, I get an error: No such var: user/help, compiling:(NO_SOURCE_PATH:1:12391) |
| 14:42 | TimMc | jro_: Does that happen in just one project? |
| 14:43 | jro_ | TimMc, yes, if I don't have project.clj, the error disappears |
| 14:44 | TimMc | jro_: But does it happen in multiple projects? |
| 14:44 | SegFaultAX | Is anyone here using Immutant? |
| 14:45 | TimMc | Probably. |
| 14:45 | SegFaultAX | TimMc: Are you? |
| 14:45 | patbrown | In addition, I'm using piggieback for a cljs browser repl, however when I compile, my "out/goog" directory always goes in the root of my project, instead of "resources/public/js/out/goog" Does anyone know how to set the output folder? Note: my "out/cljs" and "out/clojure" are outputted under the "public/js" path. |
| 14:46 | jro_ | I've currently just one checked out. Well, if it is just (user/help), then there is no problem. |
| 14:46 | TimMc | SegFaultAX: No, then I would have said "I am". :-) |
| 14:46 | SegFaultAX | TimMc: Maybe you were just being coy. ;) |
| 14:46 | TimMc | I don't know what Immutant is. Some kind of webby thing? |
| 14:47 | SegFaultAX | Yea, it's a Clojure wrapper for JBoss AS 7 |
| 14:47 | squidz | SegFaultAX: why is it useful? |
| 14:47 | SegFaultAX | Basically, torquebox for clojure (if you know what that is) |
| 14:47 | TimMc | I don't know what JBoss or torquebox is either. :-P |
| 14:48 | SegFaultAX | squidz: JBoss AS 7 or Immutant? |
| 14:48 | TimMc | Ah, from Wikipedia I gather that it is a beany webby thing. |
| 14:48 | SegFaultAX | TimMc: Yea, one of themz. |
| 14:49 | SegFaultAX | It brings together a bunch of really useful stuff all in one coherent package: hornetq, infinispan, automatic clustering, distributed transactions, etc. |
| 14:50 | SegFaultAX | From an architectural perspective it seems very attractive to have all of that already available in your stack as opposed to hacking together a bunch of disparate components (zeromq, redis, etc.) |
| 14:50 | squidz | is it worth it to integrate all that stuff into a clojure app? or wouldnt using individual packages like clojurewerkz provides? |
| 14:51 | squidz | be just as good |
| 14:52 | jcrossley3 | SegFaultAX: i'm one of the immutant developers. wassup? |
| 14:52 | SegFaultAX | squidz: I guess it depends on the project. I haven't used Immutant yet, but if I had to venture a guess I'd say because someone else has already taken the time to make sure everything is functional and well integrated. |
| 14:52 | SegFaultAX | jcrossley3: I know, I've seen all your talks! Great work by the way. :) |
| 14:52 | borkdude | gfredericks about the version from pom.properties: https://github.com/trptcolin/versioneer/blob/master/src/trptcolin/versioneer/core.clj |
| 14:52 | jcrossley3 | SegFaultAX: thanks :) |
| 14:53 | squidz | SegFaultAX: ah right, so Immutant already did all the work to wrap everything in clojure |
| 14:53 | SegFaultAX | jcrossley3: What is unclear to me is the actual deployment aspect of Immutant. Eg, I have 5 fresh EC2 nodes, how do I bootstrap immutant on them and deploy new versions across them? |
| 14:53 | SegFaultAX | jcrossley3: And how do I do things like rolling deploys, etc. |
| 14:53 | jcrossley3 | squidz: some folks like to grow their stack organically. some don't. plenty of ways to shave a yak. :) |
| 14:53 | SegFaultAX | jcrossley3: It seems like most of your talks and the documentation are geared toward the development phase and not so much on actually running in production. |
| 14:54 | SegFaultAX | squidz: Plus JBoss AS7 which is awesome all by itself. |
| 14:54 | SegFaultAX | squidz: If you're interested, checkout out jcrossley3 on InfoQ |
| 14:54 | SegFaultAX | squidz: Search for "immutant" or Jim Crossley |
| 14:54 | squidz | ill take a look thanks |
| 14:55 | jcrossley3 | SegFaultAX: that is true regarding dev vs prod. the former has been our emphasis up to this point. hoping to focus more on prod during beta cycle. |
| 14:56 | jcromartie | well that was easy |
| 14:56 | jcromartie | (-> (ScriptEngineManager.) (.getEngineByName "JavaScript") (.eval "print(\"Hello\");")) |
| 14:56 | SegFaultAX | jcrossley3: Unfortunately I need that piece before I feel like it's worth spending the time cozying up to Immutant. Do you have any idea when more information will be available? Or do you have tips for getting started now? |
| 14:56 | jcromartie | apparently Java 6 comes with Rhino now? |
| 14:56 | jcrossley3 | SegFaultAX: ec2 is rough due to lack of multicast. we're in the process of getting autoscaling to work on openshift, which is backed by ec2. once we figure that out, we'll publish that config to other native ec2 users who'd prefer not to use openshift. |
| 14:57 | SegFaultAX | jcrossley3: I'm not tied to EC2 per se. What do you recommend? |
| 14:57 | SegFaultAX | jcrossley3: (And is there documentation for production usage on it?) |
| 14:58 | jcromartie | (as of 2006 ...) |
| 15:00 | jcrossley3 | SegFaultAX: folks running it production now are using homegrown solutions, e.g. scp/rsync of immutant archives. so the story is muddy at the moment. |
| 15:00 | jcrossley3 | it's on our list :) |
| 15:01 | SegFaultAX | jcrossley3: <3 I'll keep watching closely, then. Is Immutant one of your teams top projects atm? |
| 15:02 | jcrossley3 | SegFaultAX: it's the primary focus of two of our team members. :) |
| 15:07 | tcrawley | SegFaultAX: you're welcome to join us in #immutant as well - it has a higher percentage of Immutant users compared to here |
| 15:24 | Raynes | gfredericks: You work at groupon? |
| 15:25 | borkdude | what is the typical way of deploying a ring webapp? uberjar, run with lein server, war? |
| 15:30 | borkdude | maybe I should try immutant? |
| 15:30 | amalloy | borkdude: all of those are things that people do, yes |
| 15:30 | amalloy | in fact i myself have done all of them |
| 15:30 | Raynes | I prefer using lein ring, but uberjars and wars are fine. |
| 15:30 | Raynes | But the way amalloy and I run our open source stuff tends to be pretty ghetto, so might not want to listen to us. |
| 15:31 | borkdude | amalloy I actually have two simple ring apps I want to host, I don't want to configure a web server, so invoking an embedded jetty is very convenient |
| 15:31 | amalloy | so don't do it |
| 15:32 | Raynes | amalloy: But then he'll have to actually configure jetty. He needs a web server behind jetty to reverse proxy it otherwise. |
| 15:32 | Raynes | No matter what he has to configure a web server. |
| 15:32 | amalloy | or just...run it on the right port from lein run |
| 15:32 | weavejester | Embedded Jetty behind an nginx stack would be my personal preference |
| 15:32 | Raynes | That's what we do. |
| 15:33 | Raynes | nginx is easy to configure for a simple proxy to a jetty server. |
| 15:33 | borkdude | Raynes I have nginx running, it forwards to 8080 for one app, I can let it forward to 8081 for the second app etc |
| 15:33 | Apage43 | I was doing a separate jetty and scp'ing wars around for a while |
| 15:34 | Apage43 | but that required making sure I did all my setup and teardown cleanly |
| 15:34 | weavejester | I tend to use "lein ring uberjar" rather than "lein run". It's easier to deploy. |
| 15:34 | Apage43 | just killing the thing was less to worry about |
| 15:34 | borkdude | weavejester what's the difference between lein ring uberjar and lein uberjar? |
| 15:34 | Apage43 | actually I'm using lein ring uberjar. I'm a bit confused =P |
| 15:35 | Apage43 | But yeah, I didn't actually want to install lein on the prod webserver box |
| 15:35 | Apage43 | just java |
| 15:35 | Apage43 | so I can java -jar the thing |
| 15:35 | weavejester | borkdude: The former automatically adds a main method that calls the handler, integrates :init and :destroy, and adds a manifest to make the jar executable. |
| 15:35 | Apage43 | borkdude: ring uberjar gives you a java -jar'able jar that runs the thing |
| 15:35 | borkdude | weavejester this is just what I need tnx |
| 15:48 | lsoa | I'm trying to read and parse a json file using clojure.data.json |
| 15:49 | lsoa | I'm getting an error, presumably because there's some invalid json in there |
| 15:49 | lsoa | Exception JSON error (unexpected character): clojure.data.json/-read (json.clj:222 |
| 15:49 | lsoa | is there a way to get the like that triggered that error? |
| 15:50 | lsoa | line* |
| 15:53 | MikeSeth | idiomatic way to replace elements m to n in a vector with another value? |
| 15:56 | arohner | MikeSeth: (vector (concat (take m v) new-vals (drop n v)) |
| 15:56 | arohner | maybe off-by-ones in there |
| 15:56 | MikeSeth | thanks, pondering |
| 15:56 | bbloom | arohner: you want vec, not vector |
| 15:57 | bbloom | ,(vector (range 5)) |
| 15:57 | clojurebot | [(0 1 2 3 4)] |
| 15:57 | bbloom | ,(vec (range 5)) |
| 15:57 | clojurebot | [0 1 2 3 4] |
| 15:57 | arohner | bbloom: thanks, I always get those mixed up |
| 15:57 | pjstadig | if you know it's a vector you might just use assoc over the range of m to n with reduce or something |
| 15:57 | pjstadig | instead of going to a seq and back to a vector again |
| 15:58 | bbloom | arohner: here's a mnemonic: vector is longer than vec, and [(foo)] is longer than [foo] |
| 15:58 | bbloom | pjstadig: that assumes the resulting length doesn't change |
| 15:58 | arohner | bbloom: meh. it's only a problem when doing IRC-based development |
| 15:59 | bbloom | arohner: what? you bothered to install lein? i do all my coding in lazybot |
| 15:59 | arohner | :-) |
| 16:00 | rkneufeld | patbrown: Hey, was your question about the dev namespace fully answered? I can provide further detail if you'd like |
| 16:08 | borkdude | MikeSeth https://www.refheap.com/paste/12926 <- my attempt |
| 16:12 | patbrown | Ryan, my man! Yeah, the use of the reader macro was well explained. Pedestal is a lot like cljs one. There is so much to it, it's hard to know where to start asking questions. |
| 16:14 | rkneufeld | Hey! I thought it might be you. Anyways, we load things through the dev function on account of some nastyness with user code. If there are any problems in your user code, it stops a REPL from opening whatsoever. We didn't have enough time to fully iron out the details in our dev code and opted to go the same route and keep the (dev) security blanket. |
| 16:20 | patbrown | rkneufeld: I've been playing around with the app and app-tools portion of pedestal. I really like the approach to handling state without atoms. What's your role been in the project? |
| 16:21 | rkneufeld | patbrown: I've spent most of my time in app as well. Taking on the role of community manager for the time being as well. |
| 16:22 | borkdude | how to change the portnr for the jetty instance, just PORT=xxxx java -jar bla? |
| 16:24 | nDuff | rkneufeld: ...ahh -- you're with Relevance? If you don't mind the asking -- do y'all have any intent to maintain Avout? |
| 16:25 | rkneufeld | nDuff: I believe that one is totally in the hands of David Liebke. He is no longer with Relevance. |
| 16:25 | nDuff | Ahh. |
| 16:25 | nDuff | Saw y'all on the copyright statement and assumed it was still a Relevance-sponsored project. |
| 16:26 | rkneufeld | No worries, doesn't hurt to ask. |
| 16:28 | borkdude | I'm editing a remote file with emacs… it works... |
| 16:41 | stuartsierra | As far as I know, no one is currently maintaining Avout. |
| 16:42 | bbloom | Bummer, since it's far more pleasant of an API than ZooKeeper... *cringe* |
| 16:44 | stuartsierra | ZooKeeper's not that bad. |
| 16:45 | bbloom | I found Netflix's ZooKeeper to be much more useful (and reminiscent of Google's internal Chubby API) |
| 16:46 | bbloom | s/useful/usable/ |
| 16:46 | bbloom | zookeepers API is just kinda... raw |
| 16:46 | bbloom | er i mean Netflix's Curaitor |
| 16:46 | bbloom | thats the word i wanted |
| 17:18 | thm_prover | I'm writing a graphical REPL. |
| 17:18 | thm_prover | What is the right way to connect to the REPL / handle long computations? |
| 17:19 | llasram` | thm_prover: https://github.com/clojure/tools.nrepl |
| 17:20 | thm_prover | llasram`: the word interrupt appears twice on that page, claiming nREPL has interrupt support. do you know ho the interrupt suppor towrks? |
| 17:21 | thm_prover | https://github.com/clojure/tools.nrepl/blob/master/doc/ops.md loks like what I want |
| 17:24 | llasram | thm_prover: I actually right now don't know much about nrepl outside of the basic architecture |
| 17:25 | thm_prover | llasram: thanks for the pointer; building on nREPL looks like a better solution than throwing together my own adhoc solution |
| 17:27 | technomancy | you get a lot of useful stuff for free if you build on the nrepl stack |
| 17:54 | ppppaul | anyone here using clojure and beanstalk, also how do you feel about it if you are? |
| 17:56 | nDuff | ppppaul: You mean Amazon's, or a different beanstalk? |
| 17:59 | ppppaul | aws |
| 18:02 | ppppaul | i'm wondering about people's experiences using it with clojure. i have no prior experience with beanstalk |
| 18:03 | jeremyheiler | ppppaul: We use it to deploy headless Clojure webapps and it seems to work well. (I wasn't the one who set it up.) |
| 18:06 | ppppaul | jeremyheiler, can you give me more information as to how you use it? do you deploy via git or war or via lein-beanstalk? does it help you with staging and development environments too? |
| 18:08 | kursion | Hi there, i'm new in Clojure's world :) |
| 18:09 | auser | hey hey kursion |
| 18:11 | kursion | Hey auser :) |
| 18:11 | ppppaul | i'm also a user |
| 18:14 | jeremyheiler | ppppaul: We deploy WAR files. For environemnts, we built a little webapp that manages the environments and allows us to click a button to deploy. |
| 18:15 | ppppaul | interesting |
| 18:15 | ppppaul | thanks |
| 18:16 | jeremyheiler | ppppaul: np |
| 18:17 | auser | jeremyheiler: is that open-source? |
| 18:17 | auser | that's sexy |
| 18:17 | squidz | i'm getting a lot - Use of undeclared Var - errors while trying to import domina in my namespace. Does anybody else use Domina know what im talking about? |
| 18:17 | jeremyheiler | auser: Unfortunately no. |
| 18:18 | auser | I bet it'd be rad if it was |
| 18:18 | jeremyheiler | auser: I would be, but it's not a high priority at the moment. |
| 18:18 | jeremyheiler | It* |
| 18:18 | auser | gotcha |
| 18:24 | jimkcar | does `lein repl` execute the defined -main function? |
| 18:24 | gfredericks | no |
| 18:25 | jimkcar | I have code with a database connection that throws errors when I lein repl without the database being there. I can't figure out how it is running. |
| 18:25 | jimkcar | what about macros? |
| 18:26 | nDuff | jimkcar: Could this code be getting executed as part of evaluating the namespace? |
| 18:26 | nDuff | jimkcar: if you do a (def connection (connect-to-the-database)) at top level somewhere, that would do it. |
| 18:26 | jimkcar | yeah I assume so, but I can't find where its happening |
| 18:26 | nDuff | jimkcar: (in which case, you might consider (def connection (delay connect-to-the-database)) |
| 18:27 | jimkcar | what about a defmacro .... ~(connect-to-database) |
| 18:27 | nDuff | jimkcar: Can you post your code? (refheap is a local favorite, if you don't have a preferred ad-free pastebin already) |
| 18:27 | nDuff | jimkcar: macros just rewrite your code; they don't change when the rewritten code is run. |
| 18:27 | jimkcar | ok. |
| 18:27 | jimkcar | let me scan again, and pastebin |
| 18:29 | nDuff | ...if you can include a stack trace from a failure alongside said code, that would be helpful too. |
| 18:30 | gfredericks | how does one restart the nrepl session, other than restarting emacs and nrepl-jack-in again? |
| 18:31 | nDuff | ...but I'm sure there's an easier way. |
| 18:32 | kursion | Is sublimetext a good editor for clojure guys ? |
| 18:33 | technomancy | it's not OSS |
| 18:33 | technomancy | so the tooling around it is not very good from what I gather |
| 18:33 | technomancy | gfredericks: there's an nrepl-restart command |
| 18:33 | amalloy | gfredericks: i think there's nrepl-restart or something |
| 18:34 | amalloy | well, that's my helpful advice for the day |
| 18:35 | gfredericks | technomancy: amalloy: thank you both equally |
| 18:35 | kursion | Ok technomancy |
| 18:35 | kursion | Ty |
| 18:36 | technomancy | normally I say "go with what you already know" but if you don't know any OSS editors then that's different |
| 18:37 | kursion | I find it very light and handy + lots of plugins, better than npp |
| 18:37 | amalloy | can we call the process of open-sourcing a previously closed-source app "ossifying"? |
| 18:37 | technomancy | inc by me |
| 18:37 | kursion | :D |
| 18:38 | kursion | (Going to sleep a bit, cya tomorrow) |
| 18:38 | nDuff | kursion: There are a few things pretty much critical -- paredit and nrepl support |
| 18:39 | nDuff | kursion: I wouldn't seriously consider anything without solid implementations of both. |
| 18:39 | kursion | Nrepl = terminal +bash |
| 18:39 | nDuff | Not at all. |
| 18:39 | kursion | What are your editors .? |
| 18:40 | amalloy | those things are important eventually, but if you're just playing around with the language any text editor is fine |
| 18:40 | nDuff | Having editor nrepl support means your editor knows what's in your namespaces |
| 18:40 | kursion | Hum you mean like the eclipse plugin... ? |
| 18:40 | nDuff | ...so it can autocomplete functions no matter what library they're from, it can retrieve documentation straight from the live Clojure instance, it can directly run your code... |
| 18:41 | nDuff | kursion: the best implementation of all these things is emacs. That said, the Eclipse plugin is working on it, and may eventually become passable. |
| 18:41 | kursion | Yeah the only IDE that support clojure is eclipse and the plugins |
| 18:41 | nDuff | kursion: Keep in mind that emacs has been editing LISPs for decades. Its tools in the area are very, very good. |
| 18:42 | nDuff | kursion: What definition of "IDE" do you use wherein Emacs doesn't qualify? |
| 18:42 | kursion | Emacs is alive ? Interresting .... :) |
| 18:42 | technomancy | nDuff: everyone knows IDE is short for "editor that's good at Java" |
| 18:42 | nDuff | :) |
| 18:43 | kursion | Autocomplete + intelli at least, then snippets |
| 18:43 | technomancy | snippets are for languages that don't have macros |
| 18:44 | kursion | True point |
| 18:44 | nDuff | emacs very much has autocomplete, and that autocomplete is nrepl-assisted |
| 18:44 | nDuff | and, as technomancy says, snippets are moot in Clojure. |
| 18:44 | nDuff | ...If you need them, you're Doing It Wrong. |
| 18:44 | technomancy | yeah, vim has autocomplete too |
| 18:44 | nDuff | (though yes, of course, they do exist for emacs, if you need them) |
| 18:45 | technomancy | dnolen: yes, but only because you don't have access to macros that early in the file |
| 18:45 | hyPiRion | snippets are usually for `lein new` to handle |
| 18:45 | nDuff | kursion: Take a look at the intro video for Emacs Live |
| 18:45 | __zero | what's paraedit and nrepl? |
| 18:45 | technomancy | the ns macro is not very egalitarian |
| 18:46 | kursion | Gonna redownload emacs to see this , has i said i started clojure today |
| 18:46 | dnolen | technomancy: I actually have a couple other snippets that come in handy, but it's true I do rely on them less than when I code in say JS. |
| 18:47 | nDuff | kursion: http://vimeo.com/22798433 |
| 18:47 | kursion | Ty for your advices nDuff. I appreciated this little talk :) |
| 18:47 | hiredman | clojurescript is just a very complicated set of javascript snippets dnolen has |
| 18:47 | technomancy | haha |
| 18:47 | kursion | Ok bookmarked for tomorrow :) |
| 18:47 | dnolen | hehe |
| 18:48 | nDuff | __zero: paredit is a mode specialized for editing LISPs; basically, it makes the editor structurally aware. |
| 18:48 | ivan | ~paredit |
| 18:48 | clojurebot | paredit is not for everyone, but what you need to understand ís how to become the kind of person that paredit ís for. |
| 18:49 | technomancy | ~botsnack |
| 18:49 | clojurebot | thanks; that was delicious. (nom nom nom) |
| 18:50 | nDuff | __zero: ...and nrepl is a protocol and set of tooling for, well, networked REPLs -- with support for adding things like session support, debugging operations, and other extensions via middleware. |
| 18:52 | technomancy | ,(update-in {} [] assoc :hello "world") |
| 18:52 | clojurebot | {nil {:hello "world"}} |
| 18:53 | technomancy | ^ is that surprising to anyone else? |
| 18:53 | amalloy | not anymore |
| 18:53 | pjstadig | it has a logic to it |
| 18:53 | pjstadig | seems like maybe a bug though |
| 18:54 | technomancy | amalloy: because you're paying attention to Leiningen bug reports? |
| 18:54 | amalloy | technomancy: because i've known about it for years? |
| 18:54 | technomancy | or that |
| 18:54 | hyPiRion | how does that make sense, really? |
| 18:55 | amalloy | i doubt it will ever change; i just use my own update-in* when i care about the behavior for an empty keyseq |
| 18:55 | pjstadig | amalloy: :( |
| 18:55 | hyPiRion | ,(= (update-in {} [] assoc :a :b) (update-in {} [nil] assoc :a :b)) |
| 18:55 | clojurebot | true |
| 18:55 | amalloy | hyPiRion: the contract (perhaps implicit) of update-in is that you give it a non-empty keyseq; if you give it an empty keyseq, any behavior makes sense |
| 18:56 | pjstadig | ,(doc update-in) |
| 18:56 | clojurebot | "([m [k & ks] f & args]); 'Updates' a value in a nested associative structure, where ks is a sequence of keys and f is a function that will take the old value and any supplied args and return the new value, and returns a new nested structure. If any levels do not exist, hash-maps will be created." |
| 18:56 | amalloy | whether that's a good contract i don't want to argue about, but that's the way in which it makes sense |
| 18:56 | pjstadig | not sure that's implicit |
| 18:56 | pjstadig | [k & ks] |
| 18:56 | technomancy | hyPiRion: when you put it that way it's gotta be a bug |
| 18:56 | technomancy | possibly a documentation bug |
| 18:56 | technomancy | but a bug |
| 18:57 | technomancy | oh; hrm. didn't consider :arglists as part of the doc. |
| 18:57 | technomancy | so anyway, it's silly but not worth the trek to jira. |
| 18:57 | hyPiRion | technomancy: well, the signature is [k & ks], where ks is a seq only. k has to be something |
| 18:58 | technomancy | yeah, I'll buy that |
| 18:58 | technomancy | don't have to like it though |
| 18:59 | hyPiRion | Well, I think it should throw some Arity Exception if it follows that contract. |
| 18:59 | hyPiRion | It would be better to have it accept [] though. |
| 18:59 | technomancy | clojure isn't really well-known for validating inputs to functions |
| 18:59 | technomancy | *ahem* contains? |
| 18:59 | Apage43 | it accepts it, it just doesn't do something particularly helpful |
| 18:59 | hyPiRion | well, that doesn't mean we can better on doing that |
| 19:00 | technomancy | hyPiRion: depends how you define "we" =) |
| 19:00 | hyPiRion | well, that was one interesting sentence I made. |
| 19:00 | hyPiRion | technomancy: Clojure contributors :) |
| 19:02 | amalloy | technomancy: doesn't contains? throw an exception as of 1.5? |
| 19:02 | technomancy | whoa seriously? |
| 19:02 | hyPiRion | huh, I only thought its docstring changed. |
| 19:02 | technomancy | holy smokes |
| 19:03 | hyPiRion | ,(contains? [1 2 3] :hrrng) |
| 19:03 | clojurebot | false |
| 19:03 | technomancy | I thought that was a line drawn in the sand |
| 19:03 | amalloy | ,*clojure-version* |
| 19:03 | clojurebot | {:major 1, :minor 5, :incremental 0, :qualifier "RC6"} |
| 19:03 | amalloy | ,(contains? :a :b) |
| 19:03 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: contains? not supported on type: clojure.lang.Keyword> |
| 19:04 | amalloy | &(contains? :a :b) |
| 19:04 | lazybot | ⇒ false |
| 19:04 | hyPiRion | To be fair, I was more surprised by the fact that it didn't throw there. |
| 19:13 | arrdem | anyone here used the Lexington lexer before? |
| 19:27 | rationalrevolt | would someone mind looking at a sudoku code at: https://gist.github.com/rationalrevolt/4564280 , and help me understand why (gen-random-board) never completes but (solve test-hard-board) completes? I tried putting prints on the solved? function, and it seems to keep looping even after the board is solved when i run (gen-random-board) |
| 19:28 | jimkcar | nDuff: I figured it out. |
| 19:29 | jimkcar | nDuff: it was a dependency doing it to me. |
| 19:29 | jimkcar | when I require this project, it spews log messages. https://github.com/liebke/zookeeper-clj |
| 19:40 | Apage43 | rationalrevolt: at first glance it looks like it's not going to short-circuit once it finds -a- solution, but could potentially generate a lot of solutions before it finally unwinds and discards most of them |
| 19:40 | Apage43 | possibly finding many of them multiple times |
| 19:42 | Apage43 | mm ,maybe |
| 19:42 | Apage43 | depends on the lazy-seq behavior |
| 19:43 | Apage43 | rationalrevolt: you could try grabbing a stack trace at that point (throw and catch an exception) to see how far down it is when solved? is returning true |
| 19:43 | Apage43 | could be insightful |
| 19:43 | amalloy | you're just trying to run the same naive search in a much larger probability space when you start from a blank board. you're generating gazillions of unsolvable boards |
| 19:44 | amalloy | (probably. i haven't looked too deeply, but that's one plausible explanation) |
| 19:45 | rationalrevolt | hmm, in the solved? function, i tried adding a print of the return value - and it prints true multiple times - that should mean it should break out of the solve function |
| 19:46 | rationalrevolt | i know shuffle is not lazy, but cant imagine why that will cause an infinite loop - if i remove the shuffle and start with a blank board - it completes very quickly |
| 19:46 | Apage43 | you may be being bitten by chunked seqs |
| 19:47 | nDuff | ...if that's the case, the number of times it continues will be bounded at the chunk size, so it's easy to look for. |
| 19:48 | rationalrevolt | I'm positive the shuffle is causing this behavior, because solving an empty board completes immediately |
| 19:48 | rationalrevolt | without the shuffle i mean |
| 19:49 | Apage43 | what's probably happening is that the un-shuffled prospective boards all short-circuit to unsolveable very quickly |
| 19:49 | Apage43 | where is with the shuffle it is actually going down a lot of solveable paths (due to chunked seqs) |
| 19:49 | Apage43 | *wheras |
| 19:49 | Apage43 | *whereas |
| 19:51 | Apage43 | rationalrevolt: try wrapping your (for …) in one of the seq1's defined in the answer here: http://stackoverflow.com/questions/10556421/is-for-not-actually-lazy-in-clojure |
| 19:51 | Apage43 | if that fixes it, then it is due to chunked seqs |
| 19:53 | jimkcar | nDuff: did you see what my problem was? I'd be interested to know if others see it too |
| 19:55 | jimkcar | if you create a new lein project, add [zookeeper "0.91.0"] as a dependency, lein repl, then (require '[zookeeper :as zk]) log4j messages will spew |
| 19:55 | jimkcar | 0.9.1 rather |
| 19:56 | rationalrevolt | Apage43: I have a feeling you may be right, will check |
| 20:02 | rationalrevolt | Apage43: You were right. If i made the result of shuffle a lazy seq, it completes as expected. |
| 20:02 | nDuff | jimkcar: Sounds like a topic for a zookeeper-clj ticket. I wonder, by the way, if 0.9.1 is before https://github.com/liebke/zookeeper-clj/commit/70ad3eaf010d74d821ade7f09a878850b88e4af5 |
| 20:02 | Apage43 | interesting |
| 20:02 | nDuff | jimkcar: ...could also be a side effect of interacting with java-logging |
| 20:03 | Apage43 | i guess that stops for from chunking |
| 20:03 | rationalrevolt | looks like it |
| 20:05 | jimkcar | nDuff: I've been looking through the code and don't see anywhere that would do this. If it was a side-effect of java logging, there still has to be some zk code being run to print out all the logging. |
| 20:05 | jimkcar | I'll submit a bug to them. |
| 20:05 | nDuff | jimkcar: Well, what's the namespace on the log messages? |
| 20:05 | jimkcar | zookeeper.ZooKeeper |
| 20:07 | nDuff | It's also possible for Zookeeper itself to be responsible. |
| 20:09 | nDuff | ...static class initialization can happen pretty early. |
| 20:09 | jimkcar | yeah, they have a default console log at INFO level. I wonder if they have some log call in a static block somewhere. |
| 20:09 | jimkcar | ugh |
| 20:10 | jimkcar | I can't seem to find the log4j.properties that it uses. Probably have one hidden on my classpath somewhere... |
| 20:14 | jimkcar | yep. right in the static block: https://github.com/apache/zookeeper/blob/trunk/src/java/main/org/apache/zookeeper/ZooKeeper.java |
| 20:28 | dnolen | Simply Typed Lambda Calculus in core.logic part II http://swannodette.github.com/2013/03/25/stlc-redux---part-ii/ |
| 20:28 | dnolen | trying to move a bit slower than Nada's talk at Clojure/West |
| 20:31 | bbloom | dnolen: i see you moved your blog.... my blog has been somewhat stalled by my incomplete migration to a static site generator as well.... |
| 20:33 | dnolen | bbloom: yeah |
| 20:33 | tieTYT | protocols dispatch on type, right? Does that mean they're only useful when you get java classes as input? |
| 20:33 | technomancy | tieTYT: unless you use records, but yeah... don't use protocols unless you have to. |
| 20:34 | tieTYT | ok I haven't learned records yet, I should look that up |
| 20:34 | technomancy | nah |
| 20:34 | bbloom | technomancy: well, i mean, records are just java types, right? |
| 20:34 | tieTYT | nah? |
| 20:35 | technomancy | tieTYT: don't bother unless you're writing performance-critical polymorphic code |
| 20:35 | technomancy | which is pretty rare |
| 20:35 | bbloom | tieTYT: what technomancy means is this: many new clojure programmers come from OOP & therefore use a lot of types and records |
| 20:35 | tieTYT | don't bother with records or with prototypes? |
| 20:35 | Bronsa | protocols* |
| 20:35 | technomancy | bbloom: *hand wavy dismissal to avoid confusion around advanced topics* |
| 20:35 | tieTYT | Bronsa: right |
| 20:35 | bbloom | tieTYT: types and records are often useful, but they are most often misused. so if you are new to clojure, avoid protocols, defrecord, deftype, etc |
| 20:36 | tieTYT | i'm writing a program that dispatches based off of the domain of a url. I used multimethods for this because it didn't seem like I could use a protocol when the inputs are all strings/urls |
| 20:36 | nDuff | tieTYT: multimethods are indeed the right tool for that job |
| 20:36 | tieTYT | i need to dispatch on the value, not the type |
| 20:36 | tieTYT | nDuff: good to hear, thanks |
| 20:36 | technomancy | whether that's suitable for multimethods is debatable, but it's definitely not for protocols |
| 20:36 | technomancy | it's likely you don't need polymorphism at all |
| 20:38 | tieTYT | well i suppose I could use a map of <string, function> |
| 20:38 | tieTYT | but multimethods seemed cleaner in my newbie mind |
| 20:38 | tieTYT | also seems to point out, "I'm dispatching on this" |
| 20:39 | nDuff | tieTYT: if a map has functions on the RHS, it's typically pretty clear that it's involved in dispatch. :) |
| 20:40 | tieTYT | i suppose that's true |
| 20:50 | Frozenlo` | Well well well... I finally made a breakthrough. It seems Googlebot is having a hard time with wrap-force-ssl. Can anyone concur? |
| 20:55 | jcromartie | is there any reason not to create a uuid for an item before inserting it in a persistent store? |
| 20:56 | ivan | Frozenlo`: you may be able to get some insight by forcing Googlebot to hit your site with webmaster tools and capturing traffic with wireshark |
| 20:57 | ivan | Frozenlo`: unpopular HTTPS servers sometimes have bugs, or use wrong options, or your certificate has some weird options Google doesn't like |
| 20:58 | ivan | you can also see if Googlebot likes an nginx/apache server you set up with the same cert |
| 20:58 | ivan | and compare that traffic to jetty (?) |
| 21:04 | Frozenlo` | ivan: I fired wireshark once last week and saw the initial handshake, but nothing beyond that. :/ |
| 21:04 | dyba | I have a question about this gist --> https://gist.github.com/weavejester/598020 |
| 21:05 | dyba | on line 19, can anyone explain what is going on with the argument to handler? |
| 21:05 | Frozenlo` | Raynes: pinnnnng. Ever had any problem with refheap's https and googlebot? |
| 21:05 | dyba | handlers take requests as arguments |
| 21:06 | dyba | so I was thinking that by writing the first argument as a map, we are using destructuring to capture the data we need |
| 21:06 | dyba | is that correct? |
| 21:09 | dyba | I noticed that {{name "name"} :params} isn't the same thing as {:params {name "name"}} |
| 21:13 | gfredericks | dyba: yeah the function takes one argument |
| 21:13 | gfredericks | which is assumed to be a map |
| 21:14 | gfredericks | and it destructures it by pulling out the :params key in particular |
| 21:14 | gfredericks | the value under that key is further destructured |
| 21:14 | gfredericks | pulling out the "name" key and binding that to the local `name` |
| 21:16 | dyba | gfredericks: thanks for the explanation! It makes sense now. :) |
| 21:16 | gfredericks | the weirdest thing about map destructuring is that the keys/values are usually the opposite of what you'd expect |
| 21:24 | noprompt | i'm a bit confused here. how do i change the behavior of ILookup when using defrecord? |
| 21:24 | gfredericks | I don't think you do. You use deftype if you want something more custom. |
| 21:25 | noprompt | gfredericks: ah, ok. that's kinda what i thought. |
| 21:34 | bbloom | noprompt: i should warn you that if you're trying to make a custom Map type, it's quite a difficult road to travel |
| 21:34 | bbloom | ILookup is one thing, but map with custom lookup is quite another |
| 21:36 | MikeSeth | is it possible to create a collection that is a generator? |
| 21:36 | MikeSeth | ahh, nvm |
| 21:36 | bbloom | MikeSeth: depends on what you mean by "generator". but mostly: yes. see ##(doc lazy-seq) |
| 21:36 | lazybot | ⇒ "Macro ([& body]); Takes a body of expressions that returns an ISeq or nil, and yields a Seqable object that will invoke the body only the first time seq is called, and will cache the result and return it on all subsequent seq calls. See also - realized?" |
| 21:37 | MikeSeth | bbloom: yeah, I sinned by not rtfm'ing, thanks |
| 21:53 | Raynos | Apparently there's a functional clojure GUI framework |
| 21:53 | Raynos | one that renders "scenes" or something by taking the current thing and the previous thing and rendering an efficient diff |
| 21:53 | Raynos | im trying to find it |
| 21:54 | ivan | webfui? |
| 21:54 | bbloom | Are you talking about the recently announced http://pedestal.io/ ? |
| 21:54 | noprompt | bbloom: yeah, i'm starting to see that. |
| 21:55 | bbloom | noprompt: see my dispatch-map for an example https://github.com/brandonbloom/dispatch-map |
| 21:55 | bbloom | noprompt: it's pretty tricky to get right, since there are so many interfaces/protocols/whatnot to implement |
| 21:55 | bbloom | noprompt: i'm not even sure i got it 100%, what with hash codes, equality, printing, etc |
| 21:55 | noprompt | basically i want a custom type that models a CSS rule. |
| 21:55 | noprompt | but acts like a map. |
| 21:56 | bbloom | noprompt: why does it need to be a custom type? why not just a CSS AST in a tree of maps? |
| 21:56 | noprompt | well i dunno. |
| 21:56 | noprompt | i've take the approach of modeling the CSS like so ["selector" {:prop-1 "val" :prop-2 "val}] |
| 21:57 | noprompt | but i thought it would be convenient to have Rule type that lets me lookup properties easily. |
| 21:58 | bbloom | why not just have a function of a rule map? |
| 21:58 | noprompt | can you explain what you mean? |
| 21:59 | noprompt | like (defrule [selector prop-map]) ? |
| 21:59 | bbloom | describe the intended behavior of your desired ILookup implementation |
| 22:00 | Raynos | im just looking for examples of big efficient functional GUIs |
| 22:00 | noprompt | CSS rules are defined as a selector and any number of declarations. |
| 22:00 | Raynos | I cant figure out how to create large modular UI systems |
| 22:00 | noprompt | ie, div { prop: val; prop: val } |
| 22:00 | bbloom | Raynos: heh, that's a bit of an open research problem.... |
| 22:01 | noprompt | i'd like the type to have a field for the selector and a field for the declaration map. |
| 22:01 | Raynos | i think webfui works |
| 22:01 | Raynos | I know how to create large procedural modular UI systems |
| 22:01 | bbloom | noprompt: that's SORTA sufficient, it's worth pointing out that CSS selector rules are actually ordered maps & can have duplicate keys and what not, but 99% of the time that doesn't matter |
| 22:01 | noprompt | bbloom: right. |
| 22:02 | bbloom | noprompt: anyway, what operation are you trying to accomplish? |
| 22:02 | noprompt | so to work around that |
| 22:02 | bbloom | noprompt: you can't talk about how to model something until you talk about the operations you want to achieve on your model |
| 22:02 | noprompt | ["h1" {:prop "val"} {:prop "val}] |
| 22:02 | noprompt | you can have multiple maps so you can preserve order, overwrite, etc. |
| 22:03 | noprompt | bbloom: basically i wanted to make the manipulation of rules easy. |
| 22:04 | noprompt | writing css in data structures is fine. but with CSS it's not as clean as hiccup. |
| 22:04 | bbloom | noprompt: do you know what types of manipulations you're making most often? |
| 22:04 | bbloom | hiccup is somewhat hard to manipulate, you need to do stuff like check if the second entry in a vector is a map and then flatten seqs and what not |
| 22:04 | bbloom | hiccup is optimized for expression, not for manipulation |
| 22:05 | bbloom | or rather optimized for synthesis |
| 22:05 | noprompt | bbloom: right. and i think i have the synthesis part figured out pretty good. there's a few other tricks i haven't mentioned. |
| 22:05 | noprompt | bbloom: but i've always wanted to have a flexible CSS that allowed you to pull apart selectors like you would a map. |
| 22:06 | bbloom | [:div.foo [:div.bar "baz"]] is easy to write & to compose construction, but if you want to manipulate them later, you're better off with {:tag "div" :attrs {:class "foo} :children { ...}} |
| 22:06 | noprompt | yeah and that's what i'm talking about. i could have it like that. |
| 22:06 | bbloom | a hiccup parser would read the vector notation and turn it in to clojure.data.xml style :tag, :attrs, :children representation |
| 22:06 | noprompt | and then write a few fn's and macros to make it easier. |
| 22:06 | bbloom | and by parser, i don't mean reader/parser like from strings |
| 22:07 | noprompt | so i guess then, in my case, {:rule {:selector "div" :declarations {}}} |
| 22:07 | bbloom | my suggestion is you try writing a function from hiccup -> xml maps (like clojure.data.xml) -> manipulation functions -> back to hiccup |
| 22:08 | bbloom | this way both the synthesis and manipulation models are well known and defined for you |
| 22:08 | bbloom | and you can get a feel for the design tradeoffs |
| 22:08 | bbloom | then go back to designing your models for CSS |
| 22:08 | noprompt | wait, you do understand i'm trying to compose CSS not HTML right? |
| 22:08 | bbloom | consider things like add-class |
| 22:08 | bbloom | or toggle-attribute |
| 22:08 | bbloom | etc |
| 22:09 | bbloom | yes |
| 22:09 | bbloom | i'm suggesting you experiment with this in the HTML design space, since hiccup and clojure.data.xml have already have well designed models for you to play with |
| 22:09 | bbloom | you'll get some insights you can apply to CSS |
| 22:10 | noprompt | bbloom: ah, right. yeah i started reading the hiccup source starting from the first commit, and slowly seeing how the library was put together. |
| 22:10 | Raynos | anyone use webfui ? |
| 22:11 | noprompt | i've pulled a lot of techniques from it. |
| 22:11 | bbloom | noprompt: if you try to write (fn toggle-class [hiccup-form] ...) vs (fn toggle-class [xml-tree] ...) you'll quickly see what i'm talking about :-) |
| 22:11 | noprompt | maybe the best thing to do is wrap up what i've got now, push up an alpha and get some input on the actual source. |
| 22:11 | bbloom | er i guess that toggle-class needs a class arg: [hiccup-form cls] etc |
| 22:12 | Raynos | noprompt: how do you avoid https://github.com/drcode/webfui/blob/master/webfui-examples/src-cljs/calculator/core.cljs#L44 ? |
| 22:12 | Raynos | it feels like the pattern of having `render-all ENTIRE UI` would murder performance |
| 22:12 | noprompt | Raynos: i have no clue about that stuff, sorry man. |
| 22:12 | noprompt | err woman(?) |
| 22:12 | Raynos | :( sorry |
| 22:13 | bbloom | Raynos: the same way persistent data structures avoid copying everything: you share previous structure |
| 22:13 | Raynos | bbloom: that's fine, but that function returns an entire new thing |
| 22:13 | Raynos | it doesn't mutate a thing |
| 22:13 | Raynos | i dont understand whom you can share from |
| 22:14 | noprompt | bbloom: i'll have a look at that stuff. and like i said i'll push up the code soon and see if i can't get some better insights. |
| 22:14 | noprompt | bbloom: actually i did have one other question for you regarding types. |
| 22:14 | bbloom | Raynos: like i said, functional UIs are an open reserach problem. this is tricky stuff. go look at http://pedestal.io/ |
| 22:15 | noprompt | CSS has various units. px, in, cm, em, etc. |
| 22:15 | noprompt | imagine i wanted to add px and in together and get cms |
| 22:15 | noprompt | (cm+ (px 40) (in 20)) |
| 22:15 | akhudek | bbloom: how is your term rewriting project coming along? |
| 22:15 | Raynos | bbloom: thanks |
| 22:16 | danneu | yall know that joke about generating a random string by getting a freshman CS student to quit Vim? |
| 22:16 | danneu | well i'm a Vim user using Evil-mode that just got stuck in Emacs-mode for 10 min |
| 22:16 | bbloom | noprompt: that might be a reasonable place for a type, but it might also be a reasonable place for [40 :px] |
| 22:17 | bbloom | akhudek: i published an early work in progress to https://github.com/brandonbloom/retree -- it's really just a toy at this point. i'm doing a bunch of exploring in the space & that was one experiment |
| 22:17 | noprompt | bbloom: that could work, but i'm going to have to do a lot of extra checking |
| 22:17 | bbloom | noprompt: i think cssgen does custom units, no idea of the implementation is any good |
| 22:18 | noprompt | bbloom: i'll look at it |
| 22:18 | bbloom | akhudek: kovasb had asked me about UpValues in mathematica: https://github.com/brandonbloom/retree/blob/master/src/retree/core.clj#L419-L437 |
| 22:19 | noprompt | danneu: i tried emacs with evil-mode yesterday. |
| 22:20 | noprompt | was impressed at how much better the support for vim key bindings have gotten |
| 22:21 | noprompt | bbloom: thanks again |
| 22:21 | noprompt | cya |
| 22:22 | akhudek | bbloom: I like the configurable strategy, looks like a fun little project! |
| 22:23 | bbloom | akhudek: the piece i'm most interested in is how to combine this with computing information about the tree & then minimizing compulation when changing the tree, such that it's cheap to evolve the tree & ask questions about it over time |
| 22:24 | akhudek | bbloom: that's a really hard problem, though in my experience anytime you can save redoing rewrites is a huge win |
| 22:26 | akhudek | exploring rewrites based on term size is also a massive win (e.g. knuth-bendix ordering) |
| 22:27 | bbloom | akhudek: did we meet at clojure/west? i'm trying to match names to faces to IRC handles & there was much beer drank last week |
| 22:28 | akhudek | bbloom: no, I wasn't at clojure/west, though it's possible we met at the conj. I can't remember. |
| 22:28 | bbloom | akhudek: i wasn't at the conj :-P |
| 22:28 | akhudek | bbloom: ah, that answers that :-) |
| 22:28 | bbloom | random question for the room: is there a variant of (pop []) that returns nil instead of throwing an exception? |
| 22:29 | bbloom | but otherwise preserves a vector |
| 22:33 | Raynes | Frozenlock: I don't think so. I wouldn't know what a problem with that looks like. |
| 22:33 | st3fan | does anyone know how to deal with multiple request params of the same name in compojure? |
| 22:34 | st3fan | a request like foo?stops=a&stops=b returns "b" for (:stops params) |
| 22:34 | Raynes | Raynos: Dude. Your name is way too similar to mine. |
| 22:35 | st3fan | Raynes: nothing soundex can't fix |
| 22:41 | Raynos | Raynes: dud no u |
| 22:41 | xeqi | st3fan: compojure/handler adds ring.util.params/wrap-params, which uses https://github.com/ring-clojure/ring-codec/blob/master/src/ring/util/codec.clj#L118 underneath. you might have to manually get then out of the request's :query-string if you want multiple ones with the same name |
| 22:41 | Raynes | Raynos: This can only be solved with fisticuffs in the courtyard. Duel at midnight! |
| 22:41 | Raynos | Raynes: https://twitter.com/Raynes ? |
| 22:41 | Raynes | Yes. |
| 22:41 | Raynes | No. |
| 22:42 | Raynes | IORayne |
| 22:42 | Raynos | https://twitter.com/Raynos <- |
| 22:42 | Raynos | Once you get your real name on twitter |
| 22:42 | Raynos | then we can duel |
| 22:42 | Raynes | I would if I could. :( |
| 22:42 | Raynos | its easy |
| 22:42 | Raynos | go to SF |
| 22:42 | Raynos | code at the twitter hq |
| 22:42 | Raynos | wait for a good time |
| 22:42 | st3fan | xeqi: hmm i think i'll just pass them in comma separated then |
| 22:42 | Raynes | Actually, I wonder if I know anyone at twitter... |
| 22:42 | Raynos | i had to be in SF for like 6 months before I found a good time |
| 22:42 | Raynos | to get my account changed to Raynos |
| 22:43 | Raynos | now I need to find someone at google to give me raynos@gmail.com |
| 22:43 | xeqi | Raynes: if you do let me know, I want to stake a claim as well |
| 22:43 | Raynes | Raynos: Was there any tweets on the raynos account? |
| 22:43 | Raynos | two |
| 22:43 | Raynos | from 2009 |
| 22:43 | Raynes | xeqi: Yeah, the problem with the Raynes account is that there are tweets on it. |
| 22:43 | Raynes | I'd have to have a really good friend to get them to give me the name. |
| 22:49 | arrdem | woah woah. Raynes AND Raynos? man gensym is fucking up tonight |
| 22:49 | Raynos | o_o; |
| 22:54 | Raynes | I feel like I've seen Raynos in other channels before. |
| 22:55 | danneu | wow |
| 22:55 | bbloom | Raynes: He's like your core.logic relational counterpart. Raynes is a function and Rayneso is the relation, but we can abbreviate Raynos |
| 22:56 | danneu | my irc client gives every name its own unique color. yet of course it gives Raynes and Raynos the same color |
| 22:56 | arrdem | ololol |
| 22:56 | Raynes | I think to think that I am Raynos's evil twin. |
| 22:56 | Raynos | Raynes: I have seen you |
| 22:57 | danneu | http://dl.dropbox.com/u/51836583/Screenshots/fv.png |
| 22:57 | Raynos | Raynes: do you use coffeescript? |
| 22:57 | arrdem | (inc danneu) |
| 22:57 | lazybot | ⇒ 1 |
| 22:57 | arrdem | yer all green anyway on my monitor... monochrome xterm aw yeah |
| 22:58 | bbloom | danneu: haha. that sucks. i get confused when two people have the same color and are talking to each other & their names are wildly different |
| 22:59 | Raynos | danneu: :D |
| 22:59 | Raynos | use a better hashing function |
| 23:00 | arrdem | gah fnparse make sense. |
| 23:00 | arrdem | Raynos: it's probably the Java one TBH |
| 23:00 | Raynes | Raynos: I do not use Coffeescript at all. |
| 23:00 | arrdem | ,(.hash "Raynes") |
| 23:00 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: hash for class java.lang.String> |
| 23:00 | Raynes | I may have wandered into the channel for one reason or another at some point. |
| 23:00 | Raynos | Raynes: then you are not my evil twin. My evil twin would use coffeescript |
| 23:00 | arrdem | ,(.hash Object "Raynes") |
| 23:00 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching method found: hash for class java.lang.Class> |
| 23:00 | Raynes | Fair enough. |
| 23:00 | bbloom | arrdem: hash or .hashCode |
| 23:01 | Raynes | &(hash "Raynes")( |
| 23:01 | lazybot | ⇒ -1854081710 |
| 23:01 | Raynes | &(.hashCode "Raynes") |
| 23:01 | lazybot | ⇒ -1854081710 |
| 23:01 | bbloom | ,(map (juxt hash #(.hashCode %)) ["Raynes" "Raynos"]) |
| 23:01 | clojurebot | ([-1854081710 -1854081710] [-1854081400 -1854081400]) |
| 23:01 | Raynos | I like how clojure outputs java exceptions :3 |
| 23:02 | arrdem | clojure stacktraces... |
| 23:08 | tieTYT2 | my question: http://stackoverflow.com/questions/15628682/in-clojure-how-do-you-download-an-image-from-a-webpage-and-save-it-on-your-file |
| 23:09 | arrdem | clj-http? |
| 23:09 | clojurebot | dakrone maintains clj-http |
| 23:09 | tieTYT2 | i'm using that but i didn't see an example of how to do that |
| 23:09 | tieTYT2 | i want the image, not the html |
| 23:10 | arrdem | tieTYT2: http://stackoverflow.com/questions/11321264/saving-an-image-form-clj-http-request-to-file |
| 23:10 | tieTYT2 | nice thanks |
| 23:11 | tieTYT2 | i'm going to flag my own question as a duplicate |
| 23:11 | tieTYT2 | instead of deleting it. Might help people who search |
| 23:11 | tieTYT2 | i have another question though, I don't understand that method signature |
| 23:12 | tieTYT2 | (with-open [r (java.io.FileReader. "myfile.txt")] ... |
| 23:12 | tieTYT2 | is that assigning r to the right hand side? |
| 23:12 | tieTYT2 | how is that possible? I've never seen clojure work like that before |
| 23:12 | tieTYT2 | i mean except in a let |
| 23:12 | arrdem | so that's just a normal binding form... |
| 23:13 | arrdem | we do that in let, for, doseq... |
| 23:13 | arrdem | everywhere. |
| 23:13 | tieTYT2 | can you do that anywhere? |
| 23:13 | arrdem | no. |
| 23:13 | tieTYT2 | or are these special cases? |
| 23:13 | tieTYT2 | can i make my own function that uses this form? |
| 23:13 | tieTYT2 | this binding form |
| 23:13 | arrdem | you can build something else out of that form. |
| 23:14 | arrdem | but it's the (with-open) which is creating the binding of symbol r |
| 23:14 | arrdem | one could use a (let), but with-open will only execute it's body forms if the bindings were successful (no file open errors etc.) |
| 23:17 | tieTYT2 | ok.. |
| 23:17 | tieTYT2 | but i can't expose that let as part of my api like with-open does |
| 23:17 | tieTYT2 | right? |
| 23:17 | clojurebot | technomancy: you're right I should explain the reason. The reason is I would like to be able to call aether with an extra parameter for introducing my own :transfer-listener. |
| 23:18 | SegFaultAX | tieTYT2: What are you trying to do? |
| 23:18 | tieTYT2 | SegFaultAX: nothing, just trying to understand the clojure language better |
| 23:18 | SegFaultAX | tieTYT2: What's unclear? |
| 23:19 | tieTYT2 | i've seen the binding form with functions and let |
| 23:19 | tieTYT2 | but the difference with with-open is that it's exposed on the outside |
| 23:19 | SegFaultAX | tieTYT2: What do you mean exposed on the outside? |
| 23:19 | tieTYT2 | and i was wondering if i can do that on functions i make |
| 23:19 | tieTYT2 | http://clojuredocs.org/clojure_core/clojure.core/with-open |
| 23:19 | tieTYT2 | the caller writes the binding form as a client |
| 23:20 | tieTYT2 | instead of the person who wrote with-open doing it on the inside |
| 23:20 | SegFaultAX | tieTYT2: You do that with lets to, though. |
| 23:20 | tieTYT2 | yeah but lets are on the inside of functions |
| 23:20 | SegFaultAX | tieTYT2: And yes you can use that functionality yourself if you choose to. |
| 23:20 | tieTYT2 | i can't expose them as part of the function api |
| 23:21 | tieTYT2 | wait can i do what this example does on any function I want? |
| 23:21 | tieTYT2 | i thought this was special to with-open |
| 23:21 | SegFaultAX | tieTYT2: Nothing special about it at all. |
| 23:22 | SegFaultAX | tieTYT2: Do you have a repl open? |
| 23:22 | tieTYT2 | yes |
| 23:22 | xeqi | tieTYT2: you have to use a macro and transform the code, possible but rarely done |
| 23:22 | SegFaultAX | tieTYT2: True (source with-open) |
| 23:22 | SegFaultAX | Try* |
| 23:22 | tieTYT2 | done |
| 23:22 | SegFaultAX | xeqi: Not that rare, really. |
| 23:22 | SegFaultAX | tieTYT2: You should see how they did it in with-open. You can use that as a template if you like. |
| 23:23 | tieTYT2 | ok i want to make sure i understand this first |
| 23:23 | danneu | tieTYT2: been to the readme? lots of examples |
| 23:23 | tieTYT2 | is r bound to bindings? |
| 23:23 | danneu | oh i realized i was scrolled up in chat |
| 23:23 | SegFaultAX | tieTYT2: I don't think you know what "bindings" are. |
| 23:23 | xeqi | SegFaultAX: hmm, I can't recall a similar one in clojars or lein |
| 23:24 | SegFaultAX | xeqi: A simliar what? |
| 23:24 | tieTYT2 | it's destructuring right? |
| 23:24 | SegFaultAX | tieTYT2: Look at the source, it simply expands to a normal let form. |
| 23:25 | thm_prover | http://hpaste.org/84656 <-- this code works fine for evaluating syntacticallyv alid clojure code, i.e. "(+ 2 3)" gets me "[5]". However, when I give it syntacticaly invalid code, like "(+ 2 3", I get "nil" back ... rather than an error message. How do I get error messages back from nrepl? |
| 23:25 | xeqi | a defmacro that does a binding transformation into a let |
| 23:25 | tieTYT2 | this source is a little advanced for me since it has a macro in it |
| 23:26 | tieTYT2 | maybe it's not a macro, but it's using ~@ and ~ and stuff |
| 23:26 | tieTYT2 | is there a simpler example I can look at? |
| 23:27 | SegFaultAX | tieTYT2: It's a macro, you can tell because it uses `defmacro` |
| 23:27 | tieTYT2 | i'm just looking at this first example and wondering if two arguments are passed in or one: http://clojuredocs.org/clojure_core/clojure.core/with-open |
| 23:27 | SegFaultAX | tieTYT2: Probably safe to stay away while you're learning. Come back to it in a bit. |
| 23:29 | tieTYT2 | whatever, obviously r is being BOUND to the rhs |
| 23:29 | tieTYT2 | i didn't know you could do that when you call |
| 23:29 | tieTYT2 | i thought you could only do that inside the def of a function |
| 23:30 | bbloom | odd: |
| 23:30 | bbloom | (let [v [1 2 3]] (into {} [[v 1] [(seq v) 2]])) |
| 23:30 | bbloom | vs |
| 23:30 | bbloom | er: |
| 23:30 | bbloom | ,(let [v [1 2 3]] (into {} [[v 1] [(seq v) 2]])) |
| 23:30 | clojurebot | {[1 2 3] 2} |
| 23:30 | bbloom | vs: |
| 23:30 | SegFaultAX | tieTYT2: Lets do it to (which is what with-open is using) |
| 23:30 | bbloom | ,(let [v [1 2 3]] (into {} [[(seq v) 1] [v 2]])) |
| 23:30 | clojurebot | {(1 2 3) 2} |
| 23:30 | bbloom | equiv is hard. |
| 23:30 | bbloom | :-/ |
| 23:31 | tieTYT2 | a let is inside the def of a function |
| 23:31 | tieTYT2 | but this example is calling a function and using bindings |
| 23:32 | SegFaultAX | tieTYT2: No, it isn't. |
| 23:32 | tieTYT2 | that's the thing i've never seen before |
| 23:32 | tieTYT2 | it isn't? |
| 23:32 | SegFaultAX | ,(let [a 1] a) |
| 23:32 | clojurebot | 1 |
| 23:33 | tieTYT2 | ok you can use it outside |
| 23:33 | tieTYT2 | is that what's going on? |
| 23:33 | SegFaultAX | ,(let [a 1] ((fn [] (inc a))) |
| 23:33 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 23:33 | danneu | you're still inside the let body |
| 23:33 | SegFaultAX | ,(let [a 1] ((fn [] (inc a)))) |
| 23:33 | clojurebot | 2 |
| 23:33 | tieTYT2 | <tieTYT2> but this example is calling a function and using bindings as parameters |
| 23:34 | tieTYT2 | this is the the thing that's confusing me |
| 23:34 | tieTYT2 | can you show me an example doing that? |
| 23:34 | SegFaultAX | with-open isn't a function |
| 23:35 | tieTYT2 | oh right |
| 23:35 | SegFaultAX | tieTYT2: It's a macro. |
| 23:35 | tieTYT2 | well is that the only reason youc an do this? |
| 23:35 | SegFaultAX | tieTYT2: In this case, yes. Macros are evaluated at compile time. They're similar to functions, except their inputs are always unevaluated lisp forms and their outputs are usually also unevaluated lisp forms. |
| 23:36 | SegFaultAX | tieTYT2: They allow you to transform lisp forms from one shape to another at compile time. |
| 23:36 | tieTYT2 | ok the world makes sense again |
| 23:36 | SegFaultAX | tieTYT2: In with-open's case, it's transforming the (with-open [...] ...) into a do or let form, based on the number of forms in the vector. |
| 23:37 | xeqi | &(macroexpand-1 '(with-open [r (java.io.FileReader. "myfile.txt")] r)) |
| 23:37 | lazybot | ⇒ (clojure.core/let [r (java.io.FileReader. "myfile.txt")] (try (clojure.core/with-open [] r) (finally (. r clojure.core/close)))) |
| 23:37 | tieTYT2 | at a high level i get that it's taking that vector and saying "let myvector" when it replaces the code |
| 23:37 | SegFaultAX | tieTYT2: So if the vector is empty, it literally just becomes a normal (do ...) form. |
| 23:37 | SegFaultAX | tieTYT2: If the vector is non-empty, then it becomes (let [...] ...) |
| 23:38 | tieTYT2 | ok |
| 23:38 | tieTYT2 | thanks for the help |
| 23:39 | SegFaultAX | tieTYT2: Again, I suggest deferring macros for a little while until you have a much firmer grasp on normal clojure. |
| 23:39 | tieTYT2 | well i'm not trying to write them, but i come across code that uses them and it makes me question my understanding of everything else |
| 23:43 | danneu | itd be nice if slurp decompressed |
| 23:44 | danneu | ive used a few open source projects that lean on slurp and they choke on any gzipped website |
| 23:45 | Raynes | It'd be nice if people didn't use slurp as an http client. :p |
| 23:46 | bbloom | It'd be nice if stdlibs didn't try to be helpful and automatically interpret arbitrary URIs in their fopen routines! |
| 23:46 | bbloom | sheesh, i had no idea that slurp would do that |
| 23:48 | tieTYT2 | well it takes a URL, i thought it was meant for that |
| 23:49 | danneu | i wouldnt be surprised if you could pass it a :deflate option or something. "See clojure.java.io/reader for a complete list of supported arguments." |
| 23:49 | danneu | but i see no complete list there |
| 23:51 | tieTYT2 | i'm getting this error in my repl: CompilerException java.lang.RuntimeException: Unable to resolve symbol: require in this context, compiling:(NO_SOURCE_PATH:1) |
| 23:52 | tieTYT2 | this is what I'm running: (require 'my-proj.image-site) |
| 23:52 | xeqi | tieTYT2: what namespace are you in? |
| 23:53 | tieTYT2 | my-proj.image-site |
| 23:53 | tieTYT2 | wait |
| 23:53 | tieTYT2 | it worked this time |
| 23:53 | tieTYT2 | all i did is restart the repl twicew |
| 23:59 | tieTYT2 | how do I debug this exception? http://pastebin.com/cr9rcPa6 |
| 23:59 | tieTYT2 | seems like there should be a longer stack trace |