2012-10-21
| 00:22 | ForSpareParts | Once I write some java code, tell lein about it, and do lein javac, it should be available to import within my project, right? |
| 00:23 | ForSpareParts | I've checked, and my classes were generated, but for some reason they're not found when I do an import. |
| 00:38 | ForSpareParts | So, now I've looked at the output of lein classpath: it seems that lein has not added [project-root]/classes to my classpath -- but I'm not sure how to force it to do that, or to shove the java classes in target/classes. Any ideas? |
| 00:39 | mikerose357 | anyone tried to use drip with leiningen? |
| 00:40 | callen | Clojure needs a mascot. Ideas? |
| 00:40 | callen | what about a cormorant? |
| 00:41 | callen | Crow? |
| 00:41 | xeqi | ForSpareParts: do you set the :compile-path in the project? it should default to target/classes |
| 00:41 | ForSpareParts | I just tried setting that by hand to "target/classes" -- no dice. |
| 00:42 | xeqi | ForSpareParts: what `lein version`? |
| 00:42 | ForSpareParts | 2.0.0-preview10 |
| 00:53 | callen | Cow. |
| 00:57 | tomoj | I just realized what datomic can do for automated testing |
| 00:57 | tomoj | wow |
| 01:13 | callen | tomoj: I just realized how sweet it would be to have a Clojure Cow. |
| 01:13 | callen | tomoj: also, fixtures serve the purpose you're thinking of. |
| 01:13 | callen | tomoj: you dump and reload the database from fixtures for stateful tests. |
| 01:14 | tomoj | that's what I don't want to do |
| 01:16 | tomoj | also nice to be able to run tests without even talking to something like a sql database |
| 01:18 | Sgeo | Clojure Cow? |
| 01:18 | Sgeo | Oh, as mascow |
| 01:18 | Sgeo | mascot |
| 01:19 | tomoj | is there an easier way to write #(apply vector (f (first %)) (rest %)) in core or useful? |
| 01:22 | callen | amalloy_: ^^ you're the one-liner hero. |
| 01:22 | callen | Sgeo: or Crow! |
| 01:24 | Sgeo | Does destructuring count as easier? |
| 01:25 | Sgeo | Wait, no |
| 01:25 | Sgeo | Oh, just applying f to the first element? |
| 01:35 | callen | does anybody actually do arity-based dispatch in production code? I thought people just did it through let/destructuring. |
| 01:37 | tomoj | I do arity-based dispatch wherever I want |
| 01:38 | callen | I'm just wondering how applicable it is. |
| 01:38 | callen | I don't have any real doubts that those present are capable of exhibiting volition and making the choice to use it. |
| 01:38 | callen | I'm angling for a use-case. |
| 01:39 | tomoj | you mean a use case for (fn ([x]) ([x y])) over (fn [x & [y]]) ? |
| 01:40 | callen | yes. |
| 01:40 | tomoj | the latter is uglier (to me) |
| 01:40 | tomoj | and has some overhead |
| 01:41 | tomoj | performance overhead but also sometimes cognitive overhead, imo |
| 01:41 | tomoj | that function also will accept and ignore more args after the second |
| 01:43 | tomoj | also (fn foo ([x] (foo x 42)) ([x y])) looks better to me than, uh |
| 01:43 | tomoj | well |
| 01:43 | tomoj | impossible with destructuring, huh? |
| 01:43 | tomoj | (fn [x & [y :as args]] (let [y (if (seq args) y 42)])) ? |
| 01:44 | callen | hrm. |
| 01:44 | callen | I'm comparing it in my head to the pattern matching in erlang and haskell. |
| 01:44 | tomoj | [x & [y]] is convenient sometimes but it really seems weird to me |
| 01:44 | tomoj | it says too much |
| 01:45 | tomoj | since it's common it's not so bad, but then that's another cryptic thing you do |
| 01:45 | tomoj | well, sometimes that might be pretty much exactly what you mean |
| 01:52 | callen | Does anybody know whether BSON, JSON, protocol buffers, or thrift tend to be the most compact? |
| 01:55 | amalloy | tomoj: #(update-in (vec %) [0] f)? |
| 01:56 | amalloy | a wasteful vec call, but shorter code |
| 01:56 | tomoj | ah |
| 01:57 | tomoj | (inc amalloy) |
| 01:57 | lazybot | ⇒ 32 |
| 01:57 | ForSpareParts | What's the easiest way to get lein to add a few jars to the javac step if they're not available in Maven? |
| 01:58 | Frozenlo` | Send them to clojars? :p |
| 01:58 | callen | tomoj: I told you amalloy was the brevity champ. |
| 01:59 | ForSpareParts | It's for jogl -- the versions in Maven are way, way out of date. I've messed around with lein localrepo, but it's a bust so far. |
| 02:02 | callen | Apage43: you should chuck a before/after on refheap. |
| 02:03 | Apage43 | callen: protobufs/thrift can wind up being more compact since you actually give them schema |
| 02:03 | callen | Apage43: erm, yes, I figured but I do need SCIENCE?! for this. |
| 02:03 | callen | https://github.com/Raynes/refheap.el/blob/master/refheap.el does anyone know if this is stable/working? |
| 02:03 | callen | Raynes: ^^ |
| 02:03 | Apage43 | but jackson SMILE, which the cheshire JSON lib will serialize to, is pretty compact |
| 02:04 | Raynes | callen: Yes. |
| 02:04 | Raynes | callen: I maintain it. |
| 02:04 | Raynes | No new commits because it hasn't broken yet. :p |
| 02:04 | callen | Raynes: much joy be upon you then. Thanks! |
| 02:04 | Apage43 | it will collapse repeated strings and stuff |
| 02:04 | Apage43 | and unlike BSON can always be round-tripped with JSON |
| 02:06 | callen | Raynes: btw I used your code that you wrote refheap-the-site in to help me learn clojure web dev. Much thanks for githubbing that. |
| 02:07 | Apage43 | callen: if your data fits a schema nicely and you don't have to attach some associative map "extra junk" structure, protobufs/thrift will still pretty much always be smaller than JSON, BSON, or SMILE though |
| 02:07 | callen | Apage43: well, more 'an likely, any dynamic extras are going to be a rolled-up hash-map assigned a meta field. |
| 02:07 | Raynes | callen: Cool! Happy you got some use out of it. |
| 02:07 | callen | Apage43: I'm trying to avoid over-relying on smushed clojure data. |
| 02:07 | Apage43 | depends how big that is |
| 02:08 | Apage43 | if that's the -meat- of your data, then just use SMILE |
| 02:08 | callen | I would *like* to lift the clojure data up to the explicit level. |
| 02:08 | tomoj | nil is never a valid attribute value in datomic, right? :D |
| 02:10 | Raynes | callen: At least, refheap.el worked on my old computer. I'm having some issues getting it working on this new one. Tell me if you get it working so I know I'm not crazy. |
| 02:11 | callen | Raynes: I'm actually a good test-case for this. I have a portable Emacs env that gets auto-deployed to a lot of computers with mac and linux. |
| 02:12 | callen | Raynes: bad news chief: https://www.refheap.com/paste/5998 |
| 02:12 | callen | Raynes: worked fine :P |
| 02:12 | Raynes | Try credentials. ;) |
| 02:14 | callen | non-credential'd private worked, moving onto user/token |
| 02:14 | tomoj | https://gist.github.com/05dce1cde5045996d8dc ? |
| 02:15 | Raynes | How dare you gist in my presence. |
| 02:15 | tomoj | habit |
| 02:15 | tomoj | gist.el doesn't even work for me |
| 02:15 | tomoj | so I should switch |
| 02:15 | amalloy | Raynes: https://gist.github.com/fd3fda4c707802740874 |
| 02:16 | callen | I actually looked into refheap.el because gist.el is broken, hahahahaha |
| 02:16 | callen | Raynes: something to keep in mind ^ ;) |
| 02:16 | tomoj | suppose you could just dissoc all the nil-valued keys (my gist has the bug where false disappears) |
| 02:16 | Raynes | As long as gist keeps breaking things I will be successful. |
| 02:16 | Raynes | callen: It's actually a pattern. Rubeque uses refheap because gist broke the API for them somehow. |
| 02:16 | Raynes | I'm okay with being second best. ;) |
| 02:17 | amalloy | 4clojure uses refheap because gist makes Raynes sad |
| 02:17 | callen | Raynes: worked. |
| 02:17 | callen | Raynes: it auth'd successfully using customize'd user and token. |
| 02:17 | Raynes | Cool. I guess my computer's broken. :p |
| 02:18 | callen | Raynes: Emacs 24.1.1 + Mac, and I'm 100% positive it'll work on my thinkpad + ubuntu + xmonad too. |
| 02:18 | callen | Raynes: what's your stack? Got an error/repro? |
| 02:18 | callen | Raynes: I could look into it. |
| 02:18 | Raynes | callen: "Could not create connection to www.refheap.com:443 |
| 02:18 | callen | oh cute. |
| 02:19 | callen | Raynes: does it over and over? |
| 02:19 | callen | Raynes: can you snag a debug stack? |
| 02:19 | Raynes | I have no clue how. I think the problem may be that I screwed up my credential stuff. I have some complex code that looks for creds in a file somewhere. Going to try nixing that and seeing if I can do an anon paste. |
| 02:20 | callen | Raynes: you may have brought this upon yourself. |
| 02:20 | Raynes | I'm a terrible person. |
| 02:21 | Raynes | Nope. Wont do it even anonymous. |
| 02:21 | Raynes | How do I get debug stuff? |
| 02:21 | callen | Raynes: debug-on-error |
| 02:22 | Raynes | Cool |
| 02:23 | Raynes | https://www.refheap.com/paste/9ea29d38cac4a44a8a6f10755 |
| 02:23 | Raynes | Lot's of nils there. |
| 02:24 | callen | Raynes: url.el is ...not great. |
| 02:32 | Frozenlo` | Raynes: Personna on refheap? Well, now I don't have other choice than to try it :) |
| 02:32 | Raynes | I used browserid before it was cool. |
| 02:33 | Frozenlo` | I would argue that it was always cool. |
| 02:33 | Frozenlo` | I was just too lazy to try it -_- |
| 02:37 | michaelr525 | how is persona different from the sign with (google|facebook|..) button? |
| 02:39 | Raynes | michaelr525: It doesn't use either of those things. |
| 02:40 | Raynes | The only reason I used persona is because they had documentation that let me implement it quickly and easily and I didn't want to spend any time at all on authentication crap. |
| 02:42 | Raynes | Turns out that it's also really nice. |
| 02:42 | callen | Persona is a lot nicer than the alternatives. It's still kinda weird. |
| 02:42 | callen | also, Mozilla is closer to a proper neutral party re: auth |
| 02:43 | callen | I don't really trust Google/Facebook to handle identity. |
| 02:44 | Frozenlo` | But then you'll use gmail with persona... no? |
| 02:45 | callen | Frozenlo`: not a safe assumption. |
| 02:45 | Apage43 | if you have your own domain you have the option to decide not to trust gmail at one point |
| 02:46 | Frozenlo` | indeed |
| 04:25 | AtKaaZ | ,(dorun (map println '(1)) nil) |
| 04:25 | clojurebot | nil |
| 04:25 | AtKaaZ | ,(dorun (map println '(1))) |
| 04:25 | clojurebot | 1 |
| 04:26 | AtKaaZ | ,(dorun 12 (map println '(1))) |
| 04:26 | clojurebot | 1 |
| 04:27 | AtKaaZ | ,(dorun 12 (map println '(1 2 3))) |
| 04:27 | clojurebot | 1 |
| 04:27 | clojurebot | 2 |
| 04:27 | clojurebot | 3 |
| 04:29 | AtKaaZ | what do you call this, in the case of the first one being no error, something like optimistic something? |
| 04:29 | AtKaaZ | based on dynamic typing maybe? |
| 04:30 | AtKaaZ | anyway, to the list with it :)) https://gist.github.com/3895312 |
| 04:40 | tomoj | ,(dorun (java.util.Date.) '()) |
| 04:40 | clojurebot | nil |
| 04:41 | ForSpareParts | Is it conventional to have a core.clj in every namespace? |
| 04:42 | ForSpareParts | Lein generates the initial namespace that way, but I'm not sure what the broad conventions are. |
| 04:42 | arrdem | ForSpareParts: it seems to be, but you are by no means required to keep it so |
| 04:43 | ForSpareParts | arrdem, OK. |
| 04:47 | Raynes | ForSpareParts: That's what lein generates and what most people do, but it's generally accepted that it is better if you come up with more meaningful namespaces. |
| 04:49 | tomoj | I think the reason is that you shouldn't have a single-segment namespace |
| 04:49 | tomoj | so if your library is called foo, you have to come with foo.something |
| 04:49 | tomoj | maybe |
| 04:49 | tomoj | like (use 'clojure) would be cool, but.. |
| 04:52 | ForSpareParts | Thanks, guys. |
| 05:53 | alex_baranosky | is there something I should be doing to my ClojueScript data structures before passing them to JS libraries as inputs? |
| 05:54 | alex_baranosky | maybe apply a ->js function like this one? … (defn ->js [v] (.-strobj v)) |
| 05:55 | tomoj | there is a clj->js floating around |
| 05:55 | alex_baranosky | tomoj: does it work recursively? |
| 05:56 | alex_baranosky | yeah here's one that is recursive: http://mmcgrana.github.com/2011/09/clojurescript-nodejs.html |
| 06:23 | brainopia | is there a function which returns always true for any arguments :) |
| 06:26 | AtKaaZ | ,(fn [& _] true) |
| 06:26 | clojurebot | #<sandbox$eval27$fn__28 sandbox$eval27$fn__28@f0622e6> |
| 06:26 | AtKaaZ | ,((fn [& _] true) ) |
| 06:26 | clojurebot | true |
| 06:26 | AtKaaZ | ,((fn [& _] true) 1 2) |
| 06:26 | clojurebot | true |
| 06:27 | brainopia | AtKaaZ: so, nothing built-in? |
| 06:27 | brainopia | at least for one argument? |
| 06:27 | AtKaaZ | ,(#(do true #_%&) 1 2) |
| 06:27 | clojurebot | true |
| 06:27 | AtKaaZ | brainopia, no idea to be hones:) |
| 06:27 | mindbender1 | ,(constantly true) |
| 06:27 | clojurebot | #<core$constantly$fn__2351 clojure.core$constantly$fn__2351@e13b3d1> |
| 06:27 | AtKaaZ | $find-fn 1 2 3 |
| 06:28 | AtKaaZ | thanks mindbender1 |
| 06:28 | mindbender1 | np |
| 06:28 | brainopia | mindbender1: awesome |
| 06:29 | AtKaaZ | ,((constantly 1) 2 3) |
| 06:29 | clojurebot | 1 |
| 06:29 | AtKaaZ | $find-fn true true |
| 06:30 | AtKaaZ | $findfn true true |
| 06:30 | lazybot | [clojure.set/union clojure.set/intersection clojure.set/difference clojure.core/== clojure.core/time clojure.core/dosync clojure.core/true? clojure.core/distinct? clojure.core/boolean clojure.core/doto clojure.core/macroexpand-1 clojure.core/or clojure.core/comp... https://www.refheap.com/paste/6004 |
| 06:31 | AtKaaZ | it didn't find it:)) |
| 06:31 | AtKaaZ | oh right, because it returns a function |
| 06:32 | AtKaaZ | wonder what $findfn would find constantly, if possible |
| 08:21 | wingy | i have a number and want to build a sequence that has that many elements as the nr |
| 08:21 | wingy | as many elements as the nr |
| 08:21 | AtKaaZ | ,(repeat '1) |
| 08:22 | clojurebot | (1 1 1 1 1 ...) |
| 08:22 | wingy | thx |
| 08:26 | AtKaaZ | np, ignore the ' though:) |
| 08:57 | tgoossens | hi |
| 08:58 | tgoossens | about 15 hours ago (for me yesterday evening) I ran into a problem with string escaping |
| 08:58 | tgoossens | I described the problem in a blogpost http://tgoossens.wordpress.com/2012/10/20/funix-enhancing-the-linux-terminal-by-thinking-functional/ |
| 08:58 | tgoossens | someone of this irc channel suggested |
| 08:58 | tgoossens | prn |
| 08:58 | tgoossens | but that doesn't seem to work |
| 09:05 | AdmiralBumbleBee | tgoossens: pretty sure the problem is not string escaping |
| 09:05 | AdmiralBumbleBee | since that outputs the correct string |
| 09:06 | tgoossens | so you get what i want to do right? (grep "test" (ls -la)) must be printed as ls -la | grep "test" |
| 09:06 | AdmiralBumbleBee | yep |
| 09:06 | tgoossens | also i got problems with things like |
| 09:06 | tgoossens | (ls Documents/) |
| 09:06 | tgoossens | (ls ~) |
| 09:07 | tgoossens | i guess i'll have to encode those symbols in some way |
| 09:07 | tgoossens | en decode them at the very end |
| 09:08 | tgoossens | or do you have other suggestions? |
| 09:08 | AdmiralBumbleBee | I'm trying to figure out your code atm |
| 09:08 | tgoossens | ok thanks :) |
| 09:08 | tgoossens | (ps do you like the concept? :p ) |
| 09:09 | AdmiralBumbleBee | it's ok I guess |
| 09:09 | AdmiralBumbleBee | I never thought it was a problem that needed solving, but it's a neat idea |
| 09:10 | tgoossens | i'm still not sure whether people would event want to do that. But i just saw it as a great exercise for myself (after playing around with clojure for one month) |
| 09:11 | tgoossens | i'm starting to think that the ref i used isn't necessary |
| 09:11 | AdmiralBumbleBee | it's not |
| 09:11 | AdmiralBumbleBee | that's what's making me wonder if I'm not understanding the code, or if it's really goofy |
| 09:11 | AdmiralBumbleBee | I'm leaning towards goofy |
| 09:11 | tgoossens | what do you mean with goofy? |
| 09:11 | AdmiralBumbleBee | I see no reason to use a ref |
| 09:11 | tgoossens | me neither anymore |
| 09:12 | tgoossens | i'll change that in the future. but it's not the main concern :D |
| 09:13 | tgoossens | still exercising to minimize necessity of refs :) |
| 09:13 | AdmiralBumbleBee | string-to-stack should just return a new stack |
| 09:13 | AdmiralBumbleBee | that's all |
| 09:13 | AdmiralBumbleBee | no need for the ref |
| 09:14 | tgoossens | you are absolutely right |
| 09:14 | AdmiralBumbleBee | err, list-to-stack |
| 09:14 | AdmiralBumbleBee | both actually |
| 09:16 | tgoossens | for the rest? is the code a bit clean? i'm curious on how to do this better |
| 09:16 | AdmiralBumbleBee | it looks like python with parenthesis to me |
| 09:17 | tgoossens | never wrote python before :D |
| 09:17 | AdmiralBumbleBee | i'm pretty sure there's a much more succint way to write list-to-stack |
| 09:18 | tgoossens | if i strip off the ref stuff then it is already much cleaner no ? |
| 09:18 | AdmiralBumbleBee | yep |
| 09:19 | tgoossens | done :) |
| 09:36 | wingy | AntelopeSalad: learning how to deploy it to Heroku now |
| 10:04 | antares_ | wingy: heya |
| 10:04 | wingy | antares_: hey |
| 10:05 | antares_ | wingy: do you have 10 minutes or so? |
| 10:05 | wingy | antares_: sure |
| 10:05 | antares_ | wingy: you came to Clojure from JS, right? |
| 10:06 | antares_ | wingy: do you mind reading http://clojure-doc.org/articles/language/concurrency_and_parallelism.html and telling me how much sense it makes to you? Especially the identity/values separation part. |
| 10:06 | wingy | sure |
| 10:09 | wingy | antares_: you want feedback on what could be more explanatory? |
| 10:09 | antares_ | wingy: yes, anything you did not understand or find not explanatory enough |
| 10:09 | antares_ | of missing |
| 10:09 | antares_ | (missing in the structure, we obviously have TBD sections) |
| 10:52 | wingy | antares_: https://gist.github.com/3927167 |
| 10:54 | antares_ | wingy: I added a couple of pictures, refresh |
| 10:55 | wingy | antares_: i updated as well .. refersh .. easier to read |
| 10:55 | hyPiRion | Is there any preferred way to convert a record to a map? |
| 10:56 | antares_ | wingy: several points are covered by earlier guides |
| 10:56 | wingy | i c |
| 10:56 | antares_ | wingy: some others I will try to expand. I don't know if we can turn it into a generic concurrency tutorial, at least some basic understanding is probably necessary. |
| 10:56 | hyPiRion | Or well, I suppose a record is a map. |
| 10:56 | wingy | antares_: the picture is great |
| 10:56 | wingy | i understand it even more now :) |
| 10:56 | wingy | one picture is better than 1000 words |
| 10:57 | wingy | more pics! |
| 10:57 | hyPiRion | 1001 words are better than one picture. |
| 10:57 | AtKaaZ | lol |
| 10:58 | antares_ | wingy: we will add more, for sure |
| 10:58 | antares_ | wingy: and for functions such as map, filter, remove, too |
| 10:58 | wingy | wow that would be cool |
| 11:04 | wingy | thats why i love head first series |
| 11:04 | wingy | they have a lot of pictures |
| 11:10 | Scorchin | Anyone with any experience of using the betamax mocking library around? https://github.com/wjlroe/betamax/ |
| 11:10 | Scorchin | Currently getting the following exceptin: actual: java.lang.Exception: No track in cassette: example.com matches required url, method and request |
| 11:10 | Scorchin | (betamax/with-cassette "example.com" |
| 11:10 | Scorchin | (is (= nil |
| 11:10 | Scorchin | (:request (get-json "http://example.com"))))) |
| 11:10 | Scorchin | that's ^ the code I'm using that causes the exception |
| 11:11 | Scorchin | and I have an example.com file in resources/cassettes. Really not sure what's going on. All I want to do is mock out clj-http requests |
| 11:11 | AtKaaZ | ,(nil? nil) |
| 11:11 | clojurebot | true |
| 11:11 | AtKaaZ | ,(nil? 1) |
| 11:11 | clojurebot | false |
| 11:12 | madsy | ,(nil? '()) |
| 11:12 | clojurebot | false |
| 11:12 | AtKaaZ | ,(empty? '()) |
| 11:12 | clojurebot | true |
| 11:12 | AtKaaZ | ,(empty? nil) |
| 11:12 | clojurebot | true |
| 11:13 | AtKaaZ | ,is |
| 11:13 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: is in this context, compiling:(NO_SOURCE_PATH:0)> |
| 11:50 | antares_ | wingy: better now? http://clojure-doc.org/articles/language/concurrency_and_parallelism.html |
| 11:50 | antares_ | wingy: we probably don't want to turn this guide into a book about concurrency but I find it helpful to cover most commonly used terms. I want to heavily focus on examples, though. |
| 11:50 | wingy | antares_: big W on description to Concurrency :) |
| 11:50 | wingy | yeah |
| 11:50 | antares_ | W for win? |
| 11:51 | wingy | when multiple are making progress, whether it is via time-slicing or parallelism |
| 11:51 | antares_ | ah, it is not capitalized |
| 11:51 | antares_ | corrected |
| 11:51 | wingy | yeah short descriptions are very iseful |
| 11:52 | wingy | When multiple are making progress, whether it is via time-slicing or parallelism |
| 11:52 | wingy | multiple what? |
| 11:52 | wingy | threads? |
| 11:53 | antares_ | corrected |
| 11:58 | antares_ | wingy: so you think this is an improvement over what we had? |
| 11:58 | wingy | antares_: yeah |
| 11:59 | wingy | its definitely good to know the words that are being used |
| 11:59 | wingy | i personally find it distracting to have to lookup every word in a new tab |
| 12:03 | antares_ | wingy: ok, cool |
| 12:19 | jasonleaf | Hi, what's the best way to print the current executing function name? |
| 12:22 | gfredericks | there is no easy way to do that |
| 12:24 | wingy | how do i wrap the prices in a <strong> in this hiccup template [:li {:data-role "list-divider"} "Buffet 85:- Take-away 75:-"] |
| 12:26 | wingy | [:li {:data-role "list-divider"} "Buffet <strong>85:-</strong> Take-away <strong>75:-</strong>"] |
| 12:26 | wingy | or is there an idiomatic way? |
| 12:27 | mpenet | wingy: a span with a class and change the style there, it is more flexible imo |
| 12:27 | gfredericks | "Buffet " [:strong "85:-"] " Take-away " [:strong "75:-"] |
| 12:27 | wingy | cool |
| 13:17 | goracio | hi trying to call function in clojurescript something like this - service.store(data, {:width 80 :fit "scale"},callback) and seems like {} thing doesn't convert properly, i get an error |
| 13:19 | goracio | in js code i see cljs.core.ObjMap.fromObject(["\ufdd0'width", "\ufdd0'fit"], {"\ufdd0'width":80, "\ufdd0'fit":"scale"}) wich converts to cljs.core.ObjMap not {} |
| 13:19 | goracio | so how to send js object properly ? |
| 13:20 | octagon | goracio: https://github.com/ibdknox/jayq/blob/master/src/jayq/util.cljs is that what you mean? |
| 13:21 | octagon | goracio: i meant https://github.com/ibdknox/jayq/blob/master/src/jayq/util.cljs#L18 |
| 13:21 | goracio | clj -> js ? |
| 13:21 | octagon | goracio: you want to pass a js object there, but you have a cljs map, right? |
| 13:22 | goracio | octagon: exactly |
| 13:22 | octagon | goracio: so you can do (clj->js {:foo "bar"}) |
| 13:22 | goracio | ok will try :) |
| 13:22 | octagon | to obtain a js object {foo: "bar"} |
| 13:23 | frozenlock | I'm still baffled by the fact that this isn't in cljs by default. Apparently there's cases where it doesn't work. |
| 13:23 | zoldar | ,(-> {:latitude 1 :longitude 2} ((juxt :latitude :longitude))) |
| 13:23 | clojurebot | [1 2] |
| 13:23 | zoldar | ,(-> {:latitude 1 :longitude 2} (juxt :latitude :longitude)) |
| 13:23 | clojurebot | #<core$juxt$fn__2474 clojure.core$juxt$fn__2474@7f81c084> |
| 13:23 | frozenlock | /s/is/are |
| 13:24 | zoldar | ... I'm probably missing on something obvious but why the second form returns the function itself? |
| 13:24 | octagon | frozenlock: i've heard this also, but i don't know what the details are |
| 13:24 | hyPiRion | zoldar: Look at how it expands |
| 13:25 | hyPiRion | ,(macroexpand-1 '(-> {:lat 1 :long 2} (juxt :lat :long))) |
| 13:25 | clojurebot | (juxt {:lat 1, :long 2} :lat :long) |
| 13:25 | hyPiRion | ,(-> {:lat 1 :long 2} #(juxt :lat :long)) ; should solve it |
| 13:25 | clojurebot | #<CompilerException java.lang.ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to clojure.lang.ISeq, compiling:(NO_SOURCE_PATH:0)> |
| 13:25 | hyPiRion | er. |
| 13:25 | hyPiRion | ,(-> {:lat 1 :long 2} ((juxt :lat :long))) |
| 13:25 | clojurebot | [1 2] |
| 13:26 | zoldar | hyPiRion: ok, thanks for clarifying |
| 13:27 | gfredericks | -> is all syntactic so it can't tell whether or not you're using an HOF |
| 13:35 | octagon | is there a document that describes the model for how metadata is treated in clj? |
| 13:35 | octagon | i mean like under which operations should metadata be preserved, and which not? |
| 13:37 | octagon | also i was looking at the source for clojure.zipper, and i see that the zipper data structure is storing its information as metadata on a vector. i haven't seen this approach anywhere else in clj so far, and i'm curious about it |
| 13:37 | gfredericks | ,(meta (-> [2 3] (with-meta {:foo :bar}))) |
| 13:37 | clojurebot | {:foo :bar} |
| 13:37 | gfredericks | ,(meta (-> [2 3] (with-meta {:foo :bar}) (conj 8))) |
| 13:37 | clojurebot | {:foo :bar} |
| 13:37 | gfredericks | ,(meta (-> [2 3] (with-meta {:foo :bar}) (conj 8) (empty))) |
| 13:37 | clojurebot | {:foo :bar} |
| 13:37 | gfredericks | fascinating |
| 13:37 | hyPiRion | ,(meta (-> 2 (with-meta {:foo :bar}))) |
| 13:37 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IObj> |
| 13:38 | hyPiRion | careful though. |
| 13:38 | hyPiRion | ,(meta (-> #"foo" (with-meta {:foo :bar}))) |
| 13:38 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.util.regex.Pattern cannot be cast to clojure.lang.IObj> |
| 13:38 | octagon | i'm implementing my own deftype as an immutable thing, and i want to make sure i deal correctly with metadata |
| 13:39 | gfredericks | ,(let [meta-m (fn [x] (with-meta {x x} {x x}))] (meta (merge (meta-m :foo) (meta-m :bar)))) |
| 13:39 | clojurebot | {:foo :foo} |
| 13:41 | octagon | as i understand it, the purpose of metadata is data that can be associated with a thing without altering the identity of the thing |
| 13:41 | hyPiRion | gfredericks: That's probably how merge operates. |
| 13:41 | hyPiRion | &(source merge) |
| 13:41 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: source in this context |
| 13:41 | hyPiRion | ,(source merge) |
| 13:41 | clojurebot | Source not found |
| 13:41 | hyPiRion | bleh. |
| 13:42 | gfredericks | hyPiRion: I was just experimenting with a function of two objects that is conceptually somewhat symmetric |
| 13:42 | chouser | Does anyone know how to set a jira ticket's status? I need to set a ticket to "Ready for Screening" but can't find any such field after clicking "edit" |
| 13:44 | octagon | also why would zipper be implemented using metadata to store properties instead of as a set of protocols? |
| 13:44 | chouser | octagon: zippers predates protocols |
| 13:46 | octagon | chouser: interesting, so it could have been done using protocols if they had existed? |
| 13:46 | chouser | I haven't thought about it. It's an interesting question. |
| 13:49 | octagon | i have a deftype that is essentially zipperlike, and i'd like to just prepopulate the metadata in my constructor to make it a zipper, but i don't really understand the rules for when metadata is preserved (like if an operation on an immutable object produces a new object, under which conditions should metadata be preserved?) |
| 13:54 | muhoo | i wouldn't want to mess around with implementation details of zippers |
| 14:02 | chrix | Hi, does anyone know how I can use seq-utils with Clojure 1.4? I'd like to use the seq-utils/find-first but I don't find it with the new contrib hierarchy :/ |
| 14:05 | gfredericks | is find-first just (comp first filter)? |
| 14:07 | chrix | It's the function that returns the first found item in a list. |
| 14:12 | gfredericks | by that description it sounds identical to first |
| 14:12 | gfredericks | anyhow I bet (comp first filter) does the same thing |
| 14:13 | chrix | thanks gfredericks, our messages passed each other :) |
| 14:13 | gfredericks | ah |
| 14:45 | antares_ | 2nd progress report from our Clojure documentation project (http://clojure-doc.org): http://t.co/0dkLj2uw |
| 14:45 | Sgeo | Oh hey antares_, what was your Haskell question? |
| 14:45 | Sgeo | If you didn't already get an answer. |
| 14:45 | antares_ | Sgeo: it turned out to be a bug in Aeson :/ |
| 14:46 | antares_ | which there is a pull request for but the maintainer is shy from pulling it in until some other guy gives it a look. But that guy does not care. |
| 14:46 | antares_ | So I just implemented what I needed in something other than Haskell :) |
| 14:46 | Sgeo | Ah. Well, I haven't even heard of Aeson until now |
| 14:46 | Sgeo | Oh, JSON processing |
| 14:47 | antares_ | Sgeo: thanks for remembering, though |
| 14:47 | Sgeo | yw |
| 14:58 | edlich | Close |
| 14:59 | ks` | What can I do with clojure script is the same as what can I do whith java-script, or just a part of possibilities? |
| 15:13 | ForSpareParts | What does a variable preceded by an ampersand (no space) in a function definition indicate? |
| 15:13 | ForSpareParts | i.e. (fn [a &b] ...) |
| 15:13 | metellus | it means that the function can take 2 or more args |
| 15:14 | metellus | and every arg after the first will be in a vector |
| 15:14 | ForSpareParts | metellus, I thought that was for [a & b] |
| 15:15 | metellus | the space doesn't make a difference |
| 15:15 | ForSpareParts | I was looking at the source for defn and saw this: [&form &env name & fdecl] |
| 15:16 | ks` | (do (fn aga [x] (reverse (first x))) aga '(1 2 3)) # returns (1 2 3) - what I do wrong ? |
| 15:17 | ForSpareParts | That might not actually be the args list for defn itself, I'm still not great at reading this stuff, but it can't mean "the rest" in that context, can it? For &form and &env, I mean. |
| 15:18 | metellus | ForSpareParts: I don't know, sorry |
| 15:20 | Sgeo | ks_ks, your function does three things, (reverse (first x)) which is a value that gets ignored, because it's not the last value or used somewhere etc.. Then, free floating aga, whcih gets ignored for the same reason. Then, '(1 2 3), which is the last value so is the return value. |
| 15:21 | Sgeo | ForSpareParts, &form and &env are usable in macros |
| 15:22 | Sgeo | &form is the s-expr of the macro call, and &env is the lexical environment, a map of symbols to ... stuff. Lexical environment, as in when you're in a let form |
| 15:22 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: form in this context |
| 15:23 | ForSpareParts | Sgeo, Ah, okay. |
| 15:25 | Sgeo | http://ideone.com/z6MTLx |
| 15:25 | ks_ks | Sgeo, thanks! |
| 15:25 | Sgeo | ks_ks, you're welcome |
| 15:27 | ks_ks | Sgeo, but if i do (do (defn aga [x] (first (reverse x))) aga '(1 2 3)) I'm getting the same result. |
| 15:27 | ks_ks | I think arg [x] = '(1 2 3), then it should be reversed |
| 15:27 | Sgeo | You're defining a function aga which returns '(1 2 3) |
| 15:27 | ks_ks | clj.core> (reverse '(1 2 3)) |
| 15:27 | ks_ks | (3 2 1) |
| 15:27 | ks_ks | |
| 15:28 | Sgeo | You're not even calling aga again in the function, if that's what you meant to do |
| 15:29 | ks_ks | I want just get 3 as a result |
| 15:29 | Sgeo | You're parenthesizing wrong, I think |
| 15:29 | Sgeo | The (fn...) or (defn...) needs to be contained in a a set of... oh, I misread |
| 15:30 | Sgeo | You call functions like this (aga '(1 2 3)) not like aga '(1 2 3) |
| 15:30 | ks_ks | Sgeo, got it :0 |
| 15:31 | Sgeo | Oh, I also misread your first example |
| 15:31 | ks_ks | :) |
| 15:31 | Sgeo | Cool |
| 15:31 | ks_ks | (do (defn aga [x] (first (reverse x))) (aga '(1 2 3))) |
| 15:31 | Sgeo | ,((fn [x] (first (reverse x))) '(1 2 3)) |
| 15:31 | clojurebot | 3 |
| 15:32 | ks_ks | or like that |
| 15:33 | ks_ks | what does it mean ',' before list ? |
| 15:34 | Sgeo | ks_ks, just tells clojurebot to do it |
| 15:34 | ks_ks | hm |
| 15:34 | Sgeo | ,(println , , , , "Although, note that in Clojure, , are whitespace" , , , ,,,,,,, , , ,) |
| 15:34 | clojurebot | Although, note that in Clojure, , are whitespace |
| 15:35 | ks_ks | :D |
| 15:36 | ks_ks | I think so not only |
| 15:36 | Sgeo | &(println "There's also lazybot") |
| 15:36 | lazybot | ⇒ There's also lazybot nil |
| 15:36 | ks_ks | clj.core> ,((fn [x] (first (reverse x))) '(1 2 3)) |
| 15:36 | ks_ks | 3 |
| 15:36 | ks_ks | clj.core> (do (fn [x] (first (reverse x))) '(1 2 3)) |
| 15:36 | ks_ks | (1 2 3) |
| 15:36 | ks_ks | clj.core> (do ((fn [x] (first (reverse x))) '(1 2 3))) |
| 15:36 | ks_ks | 3 |
| 15:36 | ks_ks | |
| 15:36 | Sgeo | And you can trigger ##(println "lazybot from within a line of chat.") |
| 15:36 | lazybot | ⇒ lazybot from within a line of chat. nil |
| 15:36 | ks_ks | Oh, my head.. ) |
| 15:37 | Sgeo | ks_ks, the second one makes the function but does nothing with it |
| 15:37 | Sgeo | All that do does is group statements together |
| 15:37 | ks_ks | yep |
| 15:37 | Sgeo | ,(do (println "Hello") (println "There")) |
| 15:37 | clojurebot | Hello |
| 15:37 | clojurebot | There |
| 15:37 | ks_ks | third and first variant of decision different by a couple of commas |
| 15:38 | ks_ks | strange syntax Clojure after python usage :) |
| 15:38 | ks_ks | so many constructions |
| 15:39 | Sgeo | There's a good reason for it |
| 15:39 | Sgeo | Code is data |
| 15:40 | Sgeo | (+ 1 2) will evaluate to 2, but it's also a list of the symbol + the number 1 and the number 2 |
| 15:40 | clojurebot | #<RuntimeException java.lang.RuntimeException: java.lang.NumberFormatException: For input string: "+"> |
| 15:40 | Sgeo | ? |
| 15:40 | ForSpareParts | I'm trying to wrap my head around defmacro and macroexpand -- could someone explain where I've gone wrong here? https://gist.github.com/3928201 |
| 15:40 | Sgeo | Because of this, you can write macros, which will take as arguments your code |
| 15:40 | Sgeo | And return new code |
| 15:41 | ks_ks | yep it's great .. but I can understand this may be in 2014 :) |
| 15:41 | Sgeo | ForSpareParts, looks like test-macro will try to call 'a with the argument s |
| 15:41 | Sgeo | You need to return a list, not do a list |
| 15:41 | Sgeo | You might write (defmacro test-macro [s] `(a ~s)) |
| 15:42 | Sgeo | But that won't give you what you expect because of something interesting that happens with ` |
| 15:42 | Sgeo | ForSpareParts, try this: |
| 15:42 | Sgeo | (defmacro test-macro [s] (list 'a s)) |
| 15:42 | Sgeo | I think that what that does should be sufficiently clear |
| 15:43 | ForSpareParts | Sgeo, Yep, that's perfect. Two questions: |
| 15:43 | ForSpareParts | Is there a difference between ' and `? |
| 15:43 | ForSpareParts | and |
| 15:43 | ForSpareParts | What does ~ do, in the context of the other code you suggested? |
| 15:44 | Sgeo | Both questions are related |
| 15:44 | Sgeo | ` is quasiquote, which is like ` except it allows you to actually call code within it |
| 15:44 | Sgeo | ,`(a b c ,(+ 1 2) (+ 1 2)) |
| 15:44 | clojurebot | (sandbox/a sandbox/b sandbox/c (clojure.core/+ 1 2) (clojure.core/+ 1 2)) |
| 15:44 | Sgeo | oops |
| 15:44 | Sgeo | ,`(a b c ~(+ 1 2) (+ 1 2)) |
| 15:44 | clojurebot | (sandbox/a sandbox/b sandbox/c 3 (clojure.core/+ 1 2)) |
| 15:44 | Sgeo | The ~ within the ` allows you to evaluate the code |
| 15:45 | ForSpareParts | Ah, cool! |
| 15:45 | ForSpareParts | Thanks! |
| 15:45 | Sgeo | Another thing that ` does is stick the namespace name on all the symbols |
| 15:45 | Sgeo | There is also |
| 15:45 | ForSpareParts | Is that good? Do I want it to do that? |
| 15:45 | Sgeo | Often, yes, but there might be exceptions. You could use something like ~'foo in that case |
| 15:46 | ForSpareParts | OK. |
| 15:46 | Sgeo | Having ` stick the namespace in front helps prevent collisions between symbols in the expanded result and lexically defined symbols in the code |
| 15:46 | Sgeo | (let [a 1 b 2] ... ) |
| 15:46 | Sgeo | a and b are not namespaced. |
| 15:47 | Sgeo | Note that there are considerations you need to take in mind when writing macros |
| 15:47 | Sgeo | I think this feature actually prevents one possible hygiene issue by yelling at you if you try it, but let me check |
| 15:48 | Sgeo | Awesome, it does |
| 15:48 | Sgeo | http://ideone.com/PgiIQd |
| 15:49 | dsop | is it just me or is java.jdbc not handlign escaping of tablenames, etc correctly? |
| 15:50 | ForSpareParts | Sgeo, So, I can see it prevents you from using a in a let binding (and based on that, I can imagine some other things it would probably yell at you for), but would it be bad to force that let binding with 'a? |
| 15:50 | ForSpareParts | I ask because I intended to use the macros I want to write inside of functions with some arg naming conventions, to make my code more readable/writable |
| 15:51 | Sgeo | ForSpareParts, yes. What happens if the macro gets expanded inside something else that's (let [a ...])? |
| 15:51 | ForSpareParts | Ah. |
| 15:51 | Sgeo | ,`(let [a# 5] a#) |
| 15:51 | clojurebot | (clojure.core/let [a__105__auto__ 5] a__105__auto__) |
| 15:51 | Sgeo | Do something like that |
| 15:52 | Sgeo | Or, if you can't, because you need the same symbol across different `, do something like |
| 15:52 | Sgeo | ,(let [a-var (gensym)] `(let [~a-var 5] ~a-var)) |
| 15:52 | clojurebot | (clojure.core/let [G__134 5] G__134) |
| 15:53 | Sgeo | There's another pitfall I need to show you, hold on |
| 15:56 | Sgeo | ForSpareParts, http://ideone.com/S9NlWq |
| 15:57 | Sgeo | Although, of course, note that you wouldn't use a macro for doubling stuff |
| 15:57 | ForSpareParts | Right. |
| 15:57 | ForSpareParts | Does # mean something special in these contexts? Or is it just something you tack on to keep names unique...? |
| 15:58 | Sgeo | It means something special in the context of ` |
| 15:58 | Sgeo | blah# expands in a ` to a unique symbol which is the same for all blah# within the ` |
| 15:59 | Sgeo | (Unless you're nesting ` I think) |
| 15:59 | Sgeo | ,`hello |
| 15:59 | clojurebot | sandbox/hello |
| 15:59 | Sgeo | ,`hello# |
| 15:59 | clojurebot | hello__53__auto__ |
| 15:59 | Sgeo | ,`hello# |
| 15:59 | clojurebot | hello__80__auto__ |
| 15:59 | Sgeo | ,`[hello# hello#] |
| 15:59 | clojurebot | [hello__107__auto__ hello__107__auto__] |
| 15:59 | TimMc | ,`[`a `a] |
| 15:59 | clojurebot | [(quote sandbox/a) (quote sandbox/a)] |
| 15:59 | ForSpareParts | Alright. Hm. |
| 15:59 | TimMc | heh |
| 16:00 | ivan` | does Clojure on Android still require sattvik's fork? and is there a patchset that I can apply to clojure master? |
| 16:16 | Sgeo | ForSpareParts, ##(`(1 2 ~(list 3 4 5) 6)) |
| 16:16 | lazybot | java.lang.ClassCastException: clojure.lang.Cons cannot be cast to clojure.lang.IFn |
| 16:16 | Sgeo | erm |
| 16:16 | Sgeo | ForSpareParts, ##`(1 2 ~(list 3 4 5) 6) |
| 16:16 | lazybot | ⇒ (1 2 (3 4 5) 6) |
| 16:17 | Sgeo | ForSpareParts, ##`(1 2 ~@(list 3 4 5) 6) |
| 16:17 | lazybot | ⇒ (1 2 3 4 5 6) |
| 16:17 | Sgeo | Also, the way to force an un-namespaced symbol through (be careful with this) ##`~'a |
| 16:17 | lazybot | ⇒ a |
| 16:17 | Sgeo | ##`(~'a 'a a) |
| 16:17 | lazybot | ⇒ (a (quote clojure.core/a) clojure.core/a) |
| 16:17 | ForSpareParts | Sgeo, ## means evaluate here? |
| 16:18 | ForSpareParts | Sorry, I'm a little lost... |
| 16:18 | Sgeo | ForSpareParts, yeah, it's just a thing that lazybot will recognize in the middle of a line |
| 16:18 | ForSpareParts | Oh, ok. |
| 16:18 | Sgeo | Nothing to do with Clojure itself |
| 16:18 | ForSpareParts | And @? I thought that was for deref...? |
| 16:19 | Sgeo | ~@ is different from ~ and different from @ |
| 16:19 | clojurebot | Alles klar |
| 16:19 | hyPiRion | Hm, did out bot just learn that |
| 16:19 | hyPiRion | ~@ |
| 16:19 | clojurebot | @ is splicing unquote |
| 16:19 | ForSpareParts | OK. |
| 16:19 | Sgeo | Hmm, that does raise the point of absentmindedly doing ~@blah when you wanted ~(deref blah) |
| 16:20 | ForSpareParts | Something else I'm having trouble googling: is there a version of map I can use on a vector to get back a vector? |
| 16:20 | Sgeo | ,(into {} (map inc [1 2 3 4 5])) |
| 16:20 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long> |
| 16:20 | Sgeo | ,(into [] (map inc [1 2 3 4 5])) |
| 16:20 | clojurebot | [2 3 4 5 6] |
| 16:21 | hyPiRion | ,(mapv inc [1 2 3 4 5]) ; usually turns out the same |
| 16:21 | clojurebot | [2 3 4 5 6] |
| 16:21 | Sgeo | (doc mapv) |
| 16:21 | clojurebot | "([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & ...]); Returns a vector consisting of the result of applying f to the set of first items of each coll, followed by applying f to the set of second items in each coll, until any one of the colls is exhausted. Any remaining items in other colls are ignored. Function f should accept number-of-colls arguments." |
| 16:21 | Sgeo | $findfn inc [1 2 3] [2 3 4] |
| 16:22 | lazybot | [] |
| 16:22 | ForSpareParts | Is there a situation in which the two aren't equivalent? Something to do with order...? |
| 16:22 | hyPiRion | ForSpareParts: mapv can take in anything, but spits out a vector. |
| 16:22 | Sgeo | ,(mapv inc {1 2 3 4}) |
| 16:22 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.MapEntry cannot be cast to java.lang.Number> |
| 16:23 | ForSpareParts | Alright. |
| 16:23 | hyPiRion | So the difference between map and mapv is essentially this: map is lazy, mapv is not. map returns a seq, mapv returns a vector. Both can take in any collection. |
| 16:24 | hyPiRion | Both spits out the same result, but with different data structures. |
| 16:35 | ForSpareParts | So, I've been trying to string together this stuff to write a macro I need, and I've hit another wall -- hard to describe without showing the code. Would you guys mind taking a quick look at this? https://gist.github.com/3928404 |
| 16:35 | hyPiRion | I'll have a peek |
| 16:36 | ForSpareParts | Thanks! |
| 16:36 | ForSpareParts | Right now, out-path is ignored -- I'm going to do something with it once I've got this version working. |
| 16:36 | hyPiRion | So, first of all, what are you trying to achieve? |
| 16:38 | ForSpareParts | One sec, I'll make a pretend thing that calls it -- I think it'll make more sense than trying to write it out here. |
| 16:38 | hyPiRion | ok |
| 16:44 | ForSpareParts | https://gist.github.com/3928414 |
| 16:44 | ForSpareParts | Basically, I want to generate a function that will take a state and return a transformed version of the state, based on the behaviors provided in defsignal |
| 16:45 | ForSpareParts | actually, I guess the :a argument to defsignal should be [:a], because it could be a chain. |
| 16:46 | ForSpareParts | (e.g. [:a :b :c] to get {:a {:b {:c result}}} |
| 16:46 | ForSpareParts | ) |
| 16:46 | ForSpareParts | Er, where states are maps. I should've said that before. |
| 16:46 | hyPiRion | Yeah, gotcha. |
| 16:47 | ForSpareParts | I'm trying to hack together a FRP system. Which is way the hell over my head, but, well, this is how we learn, right? |
| 16:47 | hyPiRion | One thing I wonder about. Why the multiple :a's in your example? |
| 16:47 | hyPiRion | And yeah, that's how I work at least. |
| 16:48 | ForSpareParts | multiple :a's? You mean in my call to defsignal, or...? |
| 16:48 | hyPiRion | yeah |
| 16:48 | hyPiRion | (defsignal inc-a [a [:a]] [:a] (I would assume, for chaining reasons.) |
| 16:49 | hyPiRion | So I suspect that the first is the input variable, and that the second is the output variable. Right? |
| 16:49 | hyPiRion | "variable" |
| 16:49 | ForSpareParts | The first is a set of input bindings, because there could be more than one. The second is a path to an output in the resultant map. |
| 16:49 | hyPiRion | okay, got you. |
| 16:50 | ForSpareParts | And yeah, that was another derp on my part. Should've been [a [:a]], like you said. |
| 16:52 | ForSpareParts | So, as far as I can tell, my problem right now is that I can't grab state# in the middle of evaluating the map that transforms my input bindings. |
| 16:52 | ForSpareParts | (which I need in order to make the closure for map) |
| 16:52 | Sgeo | Hmm |
| 16:53 | Sgeo | There's a way to do let stuff safely without # |
| 16:53 | Sgeo | If that helps |
| 16:53 | hyPiRion | gensym can do it. |
| 16:53 | Sgeo | In fact, Common Lisp doesn't have # (although there are macros to add similar features) |
| 16:53 | hyPiRion | second. |
| 16:54 | Sgeo | ,(let [state-sym (gensym)] `(let [~state-sym (make-a-state)] blahblahblah)) |
| 16:54 | clojurebot | (clojure.core/let [G__29 (sandbox/make-a-state)] sandbox/blahblahblah) |
| 16:55 | ForSpareParts | So I wrap the whole function definition in a let that defines the symbol I want? |
| 16:55 | ForSpareParts | Using (gensym)? |
| 16:56 | Sgeo | The let that uses gensym should not be resulting code, but executed by the macro |
| 16:56 | Sgeo | Look again at my line. It executes a let form, and returns a let form |
| 16:56 | ForSpareParts | Right, that's what I thought. |
| 16:57 | ForSpareParts | But in my case, I'd execute a let form and return a defn form, right? |
| 16:57 | Sgeo | I haven't been paying close attention, but that sounds about right |
| 16:59 | hyPiRion | https://gist.github.com/3928475 |
| 16:59 | hyPiRion | ForSpareParts: Look at that, it expands from what I can see correctly. |
| 17:01 | ForSpareParts | hyPiRion, Still not totally clear on what ~@ does |
| 17:01 | Sgeo | ForSpareParts, it splices a lis |
| 17:01 | Sgeo | list in |
| 17:01 | Sgeo | So effectly instead of bringing in a list, it ... |
| 17:02 | Sgeo | ,`(a ~@'(b c d) e) |
| 17:02 | clojurebot | (sandbox/a b c d sandbox/e) |
| 17:02 | hyPiRion | It removes a set of parens from the part after ~@. |
| 17:02 | hyPiRion | or brackets. |
| 17:02 | hyPiRion | ([]) |
| 17:04 | xeqi | https://www.refheap.com/paste/6012 is what I came up with |
| 17:04 | ForSpareParts | OK. I'm still parsing what you did in your gist, but I'm learning a lot in the process. |
| 17:04 | ForSpareParts | Er, that was directed at hyPiRion. |
| 17:04 | hyPiRion | ForSpareParts: Wish I would've time to explain. Unfortunately I have a deadline I have to reach =/ |
| 17:04 | ForSpareParts | hyPiRion, Not a problem at all! You've been super helpful! |
| 17:05 | hyPiRion | ForSpareParts: Hopefully you've got something to digest :) |
| 17:05 | ForSpareParts | Absolutely : D |
| 17:09 | Sgeo | Is that namespaced inc-a acceptable in a defn? |
| 17:11 | ForSpareParts | xeqi, would your solution work if there were multiple input bindings, i.e. [a [:a] other-binding [:b :c]]? It seems like it would only handle the one. |
| 17:11 | xeqi | it was limited to one |
| 17:12 | ForSpareParts | OK. |
| 17:12 | xeqi | would end up with a partition similar to hyPiRion's |
| 17:12 | ForSpareParts | Right. |
| 17:15 | frozenlock | I have an installation wrapper asking me for the main class of my ubejar. I assumed it was my_app.core, but it throws an error. Am I missing something? |
| 17:35 | kmicu | , (+ nil 1) |
| 17:35 | clojurebot | #<NullPointerException java.lang.NullPointerException> |
| 17:38 | S11001001 | ,(do (use 'clojure.core.incubator) (doc -?>)) |
| 17:38 | clojurebot | #<RuntimeException java.lang.RuntimeException: java.io.FileNotFoundException: Could not locate clojure/core/incubator__init.class or clojure/core/incubator.clj on classpath: > |
| 18:04 | ivan` | I typed (range) in nrepl.el, hit ctrl-c ctrl-b to interrupt, and now Emacs is permanently locked up |
| 18:05 | ivan` | oh fixed after I killed java |
| 18:08 | Sgeo | Killing Java is always the best idea :D |
| 18:18 | ivan` | appears to be fixed in 0.1.6-preview |
| 18:35 | Sgeo | ,`do |
| 18:35 | ivan` | anyone know what stopped vanilla clojure from supporting Android? doesn't look like a lot of changes, other than the com.android.dx import |
| 18:35 | clojurebot | do |
| 18:35 | Sgeo | hmm |
| 18:35 | Sgeo | ,(clojure.core/do 1 2) |
| 18:35 | clojurebot | #<CompilerException java.lang.RuntimeException: No such var: clojure.core/do, compiling:(NO_SOURCE_PATH:0)> |
| 18:35 | Sgeo | Hmm. |
| 18:35 | Sgeo | I don't like this |
| 18:36 | ivan` | &(do #()) |
| 18:36 | Sgeo | No complains about (def do 5) under ideone.com |
| 18:36 | lazybot | ⇒ #<sandbox7657$eval318214$fn__318215 sandbox7657$eval318214$fn__318215@47a729> |
| 18:36 | Sgeo | But how do I get back to the old do? |
| 18:37 | Sgeo | Oh, apparently, I simply can't refer to my custom do directly |
| 18:37 | ivan` | you want to remove `do` from your namespace? |
| 18:37 | ivan` | oh |
| 18:38 | Sgeo | If I :refer-cloure :exclude [+], I can have my own + in the namespace. I don't think do and other special forms work by the normal rules |
| 18:39 | amalloy | Sgeo: they don't |
| 18:39 | gfredericks | special forms are special |
| 18:40 | Sgeo | If I'm doing code-rewriting, and see a do symbol, I can assume that it's actually the special form? |
| 18:40 | Sgeo | And is there a function to ... get the namespace that a symbol resolves in? |
| 18:40 | gfredericks | as long as it's at the beginning of a list |
| 18:40 | ivan` | gah |
| 18:40 | gfredericks | ,(namespace (resolve 'first)) |
| 18:40 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Var cannot be cast to clojure.lang.Named> |
| 18:40 | gfredericks | ,(.namespace (resolve 'first)) |
| 18:40 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: namespace for class clojure.lang.Var> |
| 18:40 | gfredericks | ,(.getNamespace (resolve 'first)) |
| 18:40 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: getNamespace for class clojure.lang.Var> |
| 18:40 | gfredericks | well I'm sure there's something like that. |
| 18:40 | amalloy | /ban gfredericks |
| 18:41 | amalloy | &(keys (meta #'first)) |
| 18:41 | lazybot | ⇒ (:ns :name :arglists :added :static :doc :line :file) |
| 18:41 | Sgeo | Aha. |
| 18:41 | Sgeo | Neat |
| 18:41 | gfredericks | doesn't being interned imply more than just some metadata? |
| 18:42 | gfredericks | or is that not from the var's perspective? |
| 18:42 | Sgeo | Means namespace contains it, I think |
| 18:42 | Sgeo | ,(keys *ns*) |
| 18:42 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Namespace> |
| 18:42 | ivan` | (remove-ns 'user) ; fun times after doing this |
| 18:44 | Sgeo | I take it clojurebot will block (remove-ns 'sandbox) |
| 18:44 | Sgeo | ,(remove-ns 'sandbox) |
| 18:44 | clojurebot | #<Namespace sandbox> |
| 18:44 | Sgeo | ..? |
| 18:44 | Sgeo | ,(+ 1 1) |
| 18:44 | clojurebot | 2 |
| 18:44 | Sgeo | (doc remove-ns) |
| 18:44 | clojurebot | "([sym]); Removes the namespace named by the symbol. Use with caution. Cannot be used to remove the clojure namespace." |
| 18:44 | Sgeo | ,*ns* |
| 18:44 | clojurebot | #<Namespace sandbox> |
| 18:45 | Sgeo | ,(remove-ns 'user) |
| 18:45 | clojurebot | #<Namespace user> |
| 18:45 | Sgeo | ,(remove-ns 'asdf-is-a-common-lisp-thing) |
| 18:45 | clojurebot | nil |
| 19:02 | tomoj | so suppose (= 10 (let [[a b (c :or 10)] [1 2]] c)) |
| 19:03 | tomoj | can has (nil? ((fn [x (y :or nil)] y) 42)) ? |
| 19:03 | tomoj | amalloy: ^ (s/:or// for your proposal) |
| 19:04 | amalloy | tomoj: i doubt the function one will happen |
| 19:04 | tomoj | it would require changes to fn, I think? |
| 19:05 | tomoj | but you could have (fn [x & [(y :or nil)]]) with no changes :/ |
| 19:07 | amalloy | tomoj: the changes to fn you could do yourself easily enoguh, and add, say, fn+. changing the rules of destructuring at all (other) destructure points needs help from core |
| 19:08 | amalloy | and i don't think :or would appear in function signatures even if it appeared in other places, just like :as isn't allowed to bind all the function args |
| 19:12 | tomoj | doesn't seem worth it to get it in fn |
| 19:12 | tomoj | or to write fn+ |
| 19:12 | tomoj | but nice to have it in all non-root binding forms |
| 19:14 | amalloy | i'm not sure it really belongs in vectors either |
| 19:15 | amalloy | (let [[a (b :or 5)] x] [a b]): what does this return when x is nil? or when it's '[foo nil]? |
| 19:16 | tomoj | respectively [nil 5], '[foo nil] |
| 19:16 | tomoj | I'd think |
| 19:19 | amalloy | agreed, and yet you can't really get that without changing how vectors are destructured. right now it's with nthnext/nth, which doesn't have a not-found argument |
| 19:20 | tomoj | nthnext doesn't, that's a problem? |
| 19:21 | tomoj | nth does |
| 19:21 | Sgeo | Common Lisp: http://ideone.com/jpMzYT |
| 19:21 | Sgeo | Clojure: http://ideone.com/48IlsM |
| 19:21 | tomoj | nthnext just returns nil if the index is too big |
| 19:21 | tomoj | doesn't seem like a problem to me, but I haven't thought about what you'd have to change |
| 19:23 | tomoj | Sgeo: wow, how do you fix that bug in cl? |
| 19:24 | antoineB | Sgeo: what is the difference? |
| 19:24 | Sgeo | Within a package, avoid fletting a name that is used by a function in the package, I think |
| 19:26 | Sgeo | In Common Lisp, the reader gives all symbols a package name (what Clojurists would call a namespace) (I might be wrong about terminology). In Clojure, symbols are only namespaced if explicitely namespaced |
| 19:26 | Sgeo | But in Clojure, ` namespaces all the symbols it sees. |
| 19:27 | antoineB | ok |
| 19:27 | Sgeo | So, in Clojure, in the letfn, f is the symbol that the letfn sees and exposes, but f-macro emits code referring to user/f (or whatever the current namespace is) |
| 19:28 | Sgeo | In Common Lisp, the package is the same for both fs, so the flet overwrites the visible f lexically. |
| 19:28 | Sgeo | I'm not entirely certain that that's a perfect and perfectly accurate explanation, but it is my understanding. |
| 19:28 | tomoj | so that bug won't happen for users of your library, since their locals have a different package |
| 19:29 | Sgeo | Yes. |
| 19:29 | Sgeo | Also, when I first tried to write it, I used let, but that was a mistake, because functions are in a different namespace from other things. (f f) in Common Lisp refers to two different fs. The f function, then the f value. |
| 19:30 | Sgeo | Since flets and labels aren't used as often as let, that probably helps ameliorate the problem. |
| 19:30 | Sgeo | And is in fact the reason that some people believe that CL-style macros are only acceptable in a Lisp-2. |
| 19:33 | Sgeo | I vaguely remember seeing an SO question where someone porting a CL macro stumbled upon the issue |
| 19:34 | Sgeo | I have to admit, I initially hated the way Clojure did things, but it makes far more sense to me now |
| 19:34 | Baldanders` | There's a semi-famous c.l.l Erik Naggum rant on the subject of hygiene and Lisp-Xs. He coul be a bit strong n how he put things, but it's interesting reading, IMHO. Of course this predated Clojure by a bit. |
| 19:35 | tomoj | does clojure satisfy his concerns? |
| 19:36 | Baldanders` | I think it does so a lot better than Scheme does, if I understand what Clojure does correctly. |
| 19:37 | Baldanders` | But I am still learning Clojure. And I wouldn't presume to know what Erik would say about it ;). |
| 19:37 | Sgeo | Baldanders`, Scheme side-steps the issue entirely by not having CL-style macros, but its own thing which I don't understand at all. |
| 19:38 | Sgeo | Which apparently gives perfect hygiene but ... is harder to understand. |
| 19:38 | Baldanders` | Well, a lot of Schemes do have CL-style macros alongside hygienic macros. |
| 19:42 | tomoj | I hope someone implements expansion-passing style for clojure |
| 19:42 | Sgeo | expansion-passing style? |
| 19:42 | tomoj | (then I won't have to try to understand the paper..) |
| 19:43 | tomoj | google has the correct results on top |
| 20:41 | amalloy | Sgeo: i read http://www.nhplace.com/kent/Papers/Technical-Issues.html a few weeks ago. long paper about the tradeoffs between lisp-1 and lisp-2. (a) it exposed me to some dangers i hadn't thought about in lisp-1, and (b) helped me see how clojure's model addresses a lot of the lisp-1 problems |
| 20:43 | unnali | Sgeo, tomoj: late to this party, but to get the equivalent of the CL code: http://ideone.com/zdcQOo |
| 20:43 | unnali | (i.e. just don't use syntax-quote due to the fact that it puts in namespaces) |
| 20:44 | Sgeo | unnali, `(~'f ~x) should also work, I think |
| 20:44 | unnali | true! |
| 20:44 | Sgeo | But I feel like 11 is the more correct answer |
| 20:44 | unnali | I'd be inclined to agree. |
| 20:57 | frozenlo` | Is there a way to make 'spit' create directories on the fly? |
| 20:57 | amalloy | $javadoc java.io.File |
| 20:57 | lazybot | http://docs.oracle.com/javase/6/docs/api/java/io/File.html |
| 20:58 | amalloy | hm, i thought there was a method to create parents, like mkdir -p |
| 21:09 | frozenlo` | Well at least I can create a directory with (.mkdir (clojure.java.io/file <some-path>... |
| 21:10 | amalloy | oh, mkdirs |
| 21:11 | frozenlo` | Wait, I think make-parents in clojure.java.io could do it. |
| 21:11 | frozenlo` | Yup it works :) |
| 21:11 | frozenlo` | Thanks for the hints! |
| 21:30 | ivan | can I monkeypatch something in a namespace before it loads? |
| 21:31 | ivan | it's too late after it loads; a bunch of functions then reference the old function |
| 21:31 | ivan | (also does anyone else use Windows and never want to see \r\n printed anywhere?) |
| 21:36 | Sgeo | ivan, I _think_ in newer Clojure you actually can change the function |
| 21:36 | Sgeo | After other things use it |
| 21:36 | Sgeo | I'm not sure |
| 21:36 | Sgeo | Unless it's actually called upon loading the namespace, of course |
| 21:36 | Sgeo | (doc alter-var-root) |
| 21:36 | clojurebot | "([v f & args]); Atomically alters the root binding of var v by applying f to its current value plus any args" |
| 21:36 | ivan | oh, thank you |
| 21:36 | Sgeo | yw |
| 21:36 | Sgeo | I might be wrong though. And/or it might be newer versions of Clojure. |
| 21:38 | Raynes | ivan: The idea is that usually you don't refer to the thing inside the var, but the var itself which is mutable. You can use binding to change explicitly dynamic vars, and with-redefs and alter-var-root to change all of them. |
| 21:38 | danlarkin | please don't go "monkeypatching" namespaces |
| 21:39 | danlarkin | you're going down the wrong path if you think you have to do that |
| 21:39 | Sgeo | I take it not a fan of Smalltalk or Ruby? |
| 21:39 | Raynes | I'm sure there are a interesting places where that'd be useful. Especially for experimentation and such. |
| 21:40 | Raynes | Monkeypatching-like things have been useful for me for sandboxing and such. |
| 21:40 | ivan | maybe someone should not have implemented OS-inconsistent printing behaviors then |
| 21:40 | Raynes | There are usecases for this sort of thing. Not sure that is one of them. |
| 21:40 | TimMc | ivan: What's the specific problem? |
| 21:41 | danlarkin | there's like one or two usecases |
| 21:41 | danlarkin | and I'm gonna assume if he doesn't know about alter-var-root he's not tackling them |
| 21:41 | Raynes | I think it's better if he just explains his problem and let's people help him with a solution. |
| 21:42 | ivan | TimMc: nREPL in Emacs showing ^M (and I want to see ^M in files); files created with \r\n |
| 21:42 | ivan | but I should have my own printing functions and fix everyone's bugs, sure |
| 21:42 | TimMc | And it's doing this because you're on Windows? |
| 21:42 | danlarkin | no, you should submit a bug report |
| 21:42 | ivan | TimMc: yeah |
| 21:43 | danlarkin | not going to some assbackwards function injection nonsense |
| 21:43 | ivan | it's just for playing around until I find a better solution |
| 21:43 | TimMc | Sounds fine for your REPL, I guess. |
| 21:44 | danlarkin | if you solve it with hackery then it's solved for you, but if you submit a bug report (or better yet a patch) then it's fixed for everyone |
| 21:44 | TimMc | Why not both? |
| 21:44 | danlarkin | because monkeypatching is stupid and wrong |
| 21:44 | Raynes | Wow. |
| 21:45 | danlarkin | hahah |
| 21:45 | Raynes | Rawr. |
| 21:45 | TimMc | danlarkin: Look, if he's not shipping it... |
| 21:46 | Sgeo | I should make a language where monkeypatching is the ONLY way to do things |
| 21:46 | danlarkin | TimMc: that's how it starts.. |
| 21:46 | TimMc | (I assume "he", because "ivan".) |
| 21:46 | danlarkin | slippery slope! |
| 21:46 | ivan | monkeypatch main to get started |
| 21:46 | TimMc | Sgeo: JS? Ruby? |
| 21:46 | Sgeo | TimMc, more extreme |
| 21:49 | Sgeo | Along the lines of monkeypatching main, yeah |
| 22:02 | yedi | is prismatic's graph library theoretically similar to using promises |
| 22:10 | ivan | yedi: I think it's far more advanced |
| 22:10 | ivan | yedi: their graph library also implies a global view everything, not necessarily the case with promises |
| 22:10 | ivan | though maybe they support working on a graph with unknown subgraphs, I dunno |
| 22:14 | ivan | yedi: I think of promises as going in the reverse direction of Graph, with a lot less global knowledge |
| 22:37 | tomoj | prismatic's graph library is released? |
| 22:37 | tomoj | or just described? |
| 22:42 | ivan | just described |
| 22:44 | ivan | https://www.youtube.com/watch?v=A7de6pC-tnU I hope Christopher Petrilli is going to the conj as the official conj bootlegger |
| 22:53 | ynniv | is there a quickstart for clojurescript that gets me from clojure forms to a JavaScript string without all the tooling? |
| 22:53 | ynniv | starting off with a command line invocation of a compiler that relies on an environment variable to a checked out repository seems… a little heavyweight |
| 22:55 | ivan | ynniv: https://github.com/emezeske/lein-cljsbuild |
| 22:55 | ynniv | maybe parenscript has spoiled me, but anything involving "lein" is not what I'm looking for |
| 22:56 | ivan | well, it can recompile your code in the background |
| 22:56 | ynniv | I'm at the repl. I have clojure forms. I would like a JavaScript string. go. |
| 22:57 | ynniv | I don't want to manage external tooling, and I'm serving pages out of compojure |
| 22:57 | xeqi | how are you getting the compojure dep? |
| 22:58 | ynniv | lein deps? I don't understand your question. |
| 22:58 | xeqi | I misread - anything involving "lein" is not what I'm looking for as - not using lein |
| 23:00 | ynniv | oh, no. I mean, I want to load a library, pass it some forms, and get a string. I don't want to interact with an external process, or pre-compile js files. |
| 23:00 | xeqi | from a repl, the closest might be https://github.com/cemerick/piggieback |
| 23:00 | xeqi | though thats still not quite what you want |
| 23:00 | ivan | I don't think ynniv wants a CLJS REPL, just a function to compile forms |
| 23:01 | ynniv | ivan: *nod* |
| 23:06 | ivan | ynniv: you might not like the size of the output before it's run through Closure Compiler's advanced_optimizations passes |
| 23:06 | ivan | I can't find the function you're looking for compiler.clj |
| 23:06 | ivan | perhaps because ClojureScript participates in Closure's multi-file goog.require/goog.provides system |
| 23:08 | ynniv | yeah, reading the source keeps going in circles involving shell outs. this looks far more tangled than I was hoping |
| 23:09 | xeqi | wonder if (partial cljs-eval (rhino-repl-env)) ; https://github.com/cemerick/piggieback/blob/master/src/cemerick/piggieback.clj#L77 |
| 23:10 | xeqi | * wonder if ... could do whats desired |
| 23:11 | ynniv | yeah, that calls cljs.repl/evaluate-form |