Re: What would you use a #[] data literal for?
I use it in Clojurescript for a custom tuple type. For small number of items, deftypes are way faster to create and access than PersistentVectors. I use tuple type e.g. for returning multiple values from a function. Implementing #[] allowed me to have a compact syntax for creating and destructuring such tuples. (defn foo [a b] #[(+ a b) (- a b) (* a b)]) (defn foo [] (let [#[plus minus times] (foo 1 2)] (str bla bla plus blaah minus))) JW On Friday, December 28, 2012 11:15:52 PM UTC+1, vemv wrote: I was just wondering - given that we have the #() and #{} literals, why not a #[] as well? Queues look like a good fit. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: Unseemingly Eager Clojure Apprentice Seeking FizzBuzz Feeback
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Hi, Am 30.12.12 07:14, schrieb Laurent PETIT: `when` provides an implicit `do`, so I generally try to only use it when I want side-effects. (Other side-effecty forms include `do`, `doseq`, `dotimes` and `when-not`.) On the other end, using when allows you to be explicit in your code that there's no else clause And it's quite useful when working with sequences: (when-let [s (seq coll)] (do-stuff-with s)) Meikel -BEGIN PGP SIGNATURE- Version: GnuPG/MacGPG2 v2.0.18 (Darwin) Comment: GPGTools - http://gpgtools.org Comment: Using GnuPG with undefined - http://www.enigmail.net/ iQIcBAEBAgAGBQJQ4DRBAAoJEM2sO9pIirXjPioP/jpvmSpSBm7wlsNXTgTORTXG JhOw0ri1CUlw3Gg/zuXFuIXZBsga2kjF7LNk1TyDc5whNlU6WwVYGiVjqL/lCI2i j372h63/pzKfw6BSnLr9pOcRM+hu70JrvDTdk+qddJlQ68v/Uex2QvxwfGQlwDc2 ogGE2xglqzSRKWJ3g3AB5ctFhbNGn6nRNcoxvSmUOL+2KkVDn5mjP/zMsG3V/anC 9yJDZf+qJk8kWzBB0YPJIAnqgmzyWFfzsqlgiafpxWG5R+Xu9+JEDFmumPgBz2jr MLZHRSaimffiXIgW6mudLy88qoRn94tUrR9GZx/Nwx//IqqoBQn6FO+R+63BKDNK x1oR42iG87SjQM9a6h20R+VnhD7efV2/WqZC/0ZYBW5SHh1iU9Gzip1XwrPJvi8E 8WJgEPXlj3jnyEq7PHuRsQvznPuSmULqzgtAUdl3XbkxcWvJDbCupZKChzsABu8I JG0xVlokLhDn0lqnq74URV8tTe2P5096jgLQ6jiA940o+EUwozTn2nv+tmCN+pe8 LQF4VvCw07aizInR+qaAM1LOBMLjbA5Vjqi2b0rHwCVrGOl2tAqAAZNL610zb3Tz nwTG1ycs8MO+eOxCWPs677jB4QesfilaQASZ50u8ZV0pRlnhDol5rH102N1pSClg lFh4F7RhSLIDhKgZymCR =DUpD -END PGP SIGNATURE- -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: [ANN] Hosted findfn
Whoops, forgot the link. It's http://findfn.herokuapp.com/ Since there's only one dyno, the initial load time might take a while. On Saturday, December 29, 2012 6:51:55 PM UTC-6, Anthony Rosequist wrote: I love Anthony Grimes's (et al) findfn https://github.com/Raynes/findfn library, but it requires some local setup (mainly the JVM security config for clojail), so I decided to host it on Heroku. Features: - Access to findfn from any computer with no setup. - If your function has two arguments, tries the original and reversed orderings (searching for [1 2 3] , = 1, 2, 3 returns join, even though the args are backwards). - For each function, includes the docstring, namespace, the version it was added, and whether or not it has been deprecated. - Links each function to clojuredocs.org Limitations/Issues: - Non-existent error handling (it just gets stuck on the searching screen forever if any problem happens); this definitely needs to be fixed soon. - It's slow. - Only searches different orderings if you have exactly two args. I originally had it searching up to 5 permutations of your args, but it was exceeding Heroku's 30-second timeout. - Doesn't support find-arg. - Only searches clojure.core, clojure.string, and clojure.set. - Not on github yet. Let me know if you run into any issues or have any cool ideas for this. (I emailed Anthony to make sure he was fine with me using the findfn name and that the attribution was good enough) -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: What would you use a #[] data literal for?
Jozef, How do you achieve that? Thanks, Ambrose On Sun, Dec 30, 2012 at 7:45 PM, Jozef Wagner jozef.wag...@gmail.comwrote: I use it in Clojurescript for a custom tuple type. For small number of items, deftypes are way faster to create and access than PersistentVectors. I use tuple type e.g. for returning multiple values from a function. Implementing #[] allowed me to have a compact syntax for creating and destructuring such tuples. (defn foo [a b] #[(+ a b) (- a b) (* a b)]) (defn foo [] (let [#[plus minus times] (foo 1 2)] (str bla bla plus blaah minus))) JW On Friday, December 28, 2012 11:15:52 PM UTC+1, vemv wrote: I was just wondering - given that we have the #() and #{} literals, why not a #[] as well? Queues look like a good fit. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
limit keys from client JSON (select-keys but nested?)
Hello, I have client providing JSON data that is read into a map. What I'm wondering is what is the best way to limit the data to only keys I white list. { :user { :first John :last Doe :role admin } } In this example I wouldn't want to read the role key. I can do `(select-keys user [:first :last])` for this example. My two questions are: 1) Can you do this with destructuring? I see lots of examples of destructuring a map into key values, but I wasn't sure if you could destructure a map into another map. 2) Is there a good way of doing this with nested maps? An example: { :user { :first John :last Doe :dob { :month 12 :day 30 :year 2012 :garbage asdf } } } I would want to make sure :dob only contains keys :month, :day, :year. Thanks! -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: Clarification on setting up Clojure, Lein and Emacs on fedora
On Sat, Dec 29, 2012 at 8:46 PM, Sayth Renshaw flebber.c...@gmail.com wrote: https://github.com/technomancy/clojure-mode/blob/master/doc/index.md will read and let you know if I find anything that could be improved. Actually I just updated the Emacs tutorial on clojure-doc.org last night, so this might be a better resource if you're looking for something more in-depth: http://clojure-doc.org/articles/tutorials/emacs.html -Phil -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: Will the JVM will always likely, remain the primary Clojure implementation ?
IDE tools also picked up the trend ! http://itsacobolworld.blogspot.ca/2012/12/free-mainframe-cobol-developer-ide.html?m=1 Happy New Year Cobol fans ! :) If longevity is your top most concern, I have a suggestion here: http://www.itarchitectforumblog.com/content/application_development/cobol_dead_language_rising.html And if you do not think it's all around us: http://itsacobolworld.blogspot.ca/?m=1 This thing has been alive and kicking since the 60s and has it seems a bright future. However, do not expect to do anything significant under 15000 locs per code units (aka namespace) or to become functional any time soon :))) Life is made of compromises... Luc P. If you don't get a flood of responses, I think it is because in this thread and the one linked earlier that Leon Adler started, several different people have explained evidence that Clojure on the JVM has had active development for five years, it is open source, and no one knows of any evidence that this will change any time in the future. That isn't the same as saying will remain, but it is the best anyone can give you that is based on evidence and reason, rather than some other dubious methods. If you believe another language will give you better assurances than that about its future target/platform, I don't see how you came to that conclusion, unless it is by making up conclusions out of thin air. Andy On Dec 29, 2012, at 2:58 AM, Leon Adler wrote: That's unforeseeable because, that represents a very long time. Having said that, this statement deserves a resay... The JVM will remain the primary target/platform for Clojure, while Oracle remains good i.e. it doesn't get Barmy. What say the other people? On Saturday, December 29, 2012 3:53:12 PM UTC+5:30, Sukh Singh wrote: Having read the posts all over again, can I say that the JVM will remain the primary target/platform for Clojure, while Oracle remains good i.e. it doesn't get Barmy ? Isn't that unforeseeable? On Thursday, December 27, 2012 4:56:52 PM UTC+5:30, Sukh Singh wrote: Hi, I have noticed that this question is randomly appearing in many minds, and it is frequently being asked, though there is no apparent reason on why it is asked :/ or maybe people are unable to pen down the exact reasons, and sad to say, even myself. There are reasons for which I ask this question - People (Majority) tend to stick with the primary implementations of certain multi-implementation software. And in the case of Clojure, the JVM implementation is the primary implementation now. Having a primary implementation in case of BDFL lead software helps as a glue in the community. For example , CPython is the primary python implementation, even if there is an existance of IronPython or JPython. The doubts of many, including me, will be cleared by an abstract answer... That 'many' also include the companies adopting something new, in this particular case, adopting clojure QUESTION Rich Hickey chose JVM as the platform of choice when he invented Clojure. It's community developed set of tools and documentation grew around the JVM (Leiningen, for example). From the above statements, can I say that the JVM will always likely, remain the primary Clojure implementation ? Thank You. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- Softaddictslprefonta...@softaddicts.ca sent by ibisMail from my ipad! -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- Softaddictslprefonta...@softaddicts.ca sent by ibisMail from my ipad! --
Re: Trouble calling Dojo grid constructor from ClojureScript
I don't want to bog the list down with my javascript naivete, but the full fix to dojo/on.js is something like this: if (type.call !(((typeof type) === string) || (type instanceof String))){... On Wednesday, November 28, 2012 9:15:11 PM UTC-8, Brian Nelson wrote: ok. I've had some time to look into this now and have figured out a few things. 1. This is not due to calling the DGrid constructor from clojurescript. It occurs even when I call the DGrid constructor from straight javascript code. So it doesn't have to do with the clojurescript code calling the constructor. 2. The error goes away if I don't require cljs.core. If cljs.core is required then the grid constructor ends up calling back into some code in cljs.core, which is where the error occurs. So I'm a little further down the road but still don't know exactly why doing a goog.require(cljs.core) causes cljs.core to receive events from the DGrid constructor. Digging in with my javascript debugger and will update this as I find out more information. On Monday, November 19, 2012 11:15:54 PM UTC-6, Brian Nelson wrote: Hi, I'm brand new to ClojureScript and have been trying to get myself familiarized with it's javascript interop capabilities by implementing the Dojo toolkit tutorials. I've successfully implemented several of the tutorials, but now I've run into something that I can't figure out and am looking for someone to point me in the right direction. I am calling the DGrid(Dojo grid) constructor using the function maingrid (ns couchadmin.core (:use [jayq.util :only [clj-js]]) (:require [clojure.browser.repl :as repl])) (defn greet [dom fx] (let [element (.byId dom greetingcljs)] (set! (. element -innerHTML) Hello from Dojo using ClojureScript) (.play (.slideTo fx (clj-js {:top 200 :left 200 :node element}) (defn maingrid [dom grd] (do (grd. (clj-js {:columns (clj-js {:first First Name})}) grid) (js/alert hello world))) (defn ^:export main [] (comment (repl/connect http://localhost:9000/repl;)) (comment (js/require (array dojo/dom dojo/fx dojo/domReady!) greet)) (js/require (array dojo/dom dgrid/Grid dojo/domReady!) maingrid)) When the page is loaded the grid is constructed, but afterwards I see the following javascript exception Uncaught Error: No protocol method ILookup.-lookup defined for type object: [object HTMLDivElement] I'm wondering what this message is indicating. Did I call the constructor incorrectly? Is this an incompatibility with Dojo? Do I need to implement ILookup somehow? Any help would be greatly appreciated. Brian -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: Unseemingly Eager Clojure Apprentice Seeking FizzBuzz Feeback
On Sun, Dec 30, 2012 at 4:32 AM, Meikel Brandmeyer m...@kotka.de wrote: (when-let [s (seq coll)] (do-stuff-with s)) I would find when-let a lot more useful if it worked with multiple bindings, e.g., (when-let [x blah1 y blah2 z blah3] (+ x y z)) should shortcut return nil if any of x, y, z evaluate to falsey. Actually, I usually use Christophe Grand's version of when-let and if-let which handle this. I find it to be more useful that way. Any idea why core's when-let/if-let don't behave this way? I've been looking through the monad material lately, and it seems like let is the identity monad, for is the sequence monad, and when-let wants to be the maybe monad, but isn't quite because it only handles one binding. Doesn't it seem most natural to let it handle multiple bindings? What am I missing? -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: Unseemingly Eager Clojure Apprentice Seeking FizzBuzz Feeback
If-let would be confusing if it handled multiple bindings, since you wouldn't know how much had succeeded when you executed the else branch. That doesn't apply to when-let; fortunately it's quite simple to write one that does do multiple bindings in terms of the existing when-let, and it would be very similar to the maybe monad. It still would not be the maybe monad for the same reason that the existing maybe-m in the monads library isn't actually the maybe monad: without a Just-like wrapper meaning success, it's impossible to successfully return nil. Sent from my iPhone On Dec 30, 2012, at 11:56 AM, Mark Engelberg mark.engelb...@gmail.com wrote: On Sun, Dec 30, 2012 at 4:32 AM, Meikel Brandmeyer m...@kotka.de wrote: (when-let [s (seq coll)] (do-stuff-with s)) I would find when-let a lot more useful if it worked with multiple bindings, e.g., (when-let [x blah1 y blah2 z blah3] (+ x y z)) should shortcut return nil if any of x, y, z evaluate to falsey. Actually, I usually use Christophe Grand's version of when-let and if-let which handle this. I find it to be more useful that way. Any idea why core's when-let/if-let don't behave this way? I've been looking through the monad material lately, and it seems like let is the identity monad, for is the sequence monad, and when-let wants to be the maybe monad, but isn't quite because it only handles one binding. Doesn't it seem most natural to let it handle multiple bindings? What am I missing? -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: cljs-clj interop
Ah, you're right -- thanks. That leads me to another error: ClojureScript:cljs.user (extend-type js/Packages.clojure.lang.IFn IFn (-invoke ([this] (.invoke this Error evaluating: (extend-type js/Packages.clojure.lang.IFn IFn (-invoke ([this] (.invoke this :as Packages.clojure.lang.IFn.prototype.cljs$core$IFn$ = true;\nPackages.clojure.lang.IFn.prototype.call = (function (this_sym23394){\nvar this_sym23394__23395 = this;\nvar this__23396 = this_sym23394__23395;\nreturn this__23396.invoke();\n});\nPackages.clojure.lang.IFn.prototype.apply = (function (this_sym23392,args23393){\nreturn this_sym23392.call.apply(this_sym23392,[this_sym23392].concat(args23393.slice()));\n});\n org.mozilla.javascript.EcmaError: TypeError: Cannot set property cljs$core$IFn$ of null to true (cljs repl#25) at cljs repl:25 (anonymous) at cljs repl:25 (anonymous) at cljs repl:25 I'll keep investigating. On 30 December 2012 12:31, David Nolen dnolen.li...@gmail.com wrote: I think you've just formatted your code incorrectly. Did you try something like this? (extend-type js/Packages.clojure.lang.IFn IFn (-invoke ([this] (.invoke this)) ([this a] (.invoke this a))) ) On Sat, Dec 29, 2012 at 8:22 PM, Stuart Campbell stu...@harto.org wrote: Hi all, I'm toying with a way to use Clojure objects from a Rhino-based ClojureScript environment (https://github.com/harto/rhino-bridge). I've been able to export a Clojure function into the ClojureScript environment without too much difficulty. Ideally, I'd like to be able to call that function as if it were a regular ClojureScript function. I was hoping I could do something like: (extend-type js/Packages.clojure.lang.IFn IFn (-invoke [this] (.invoke this)) (-invoke [this a] (.invoke this a)) ;; etc ) However, this yields an error that I don't quite understand: java.lang.UnsupportedOperationException: nth not supported on this type: Symbol at clojure.lang.RT.nthFrom(RT.java:846) at clojure.lang.RT.nth(RT.java:796) at cljs.core$extend_type$assign_impls__7365$fn__7377$adapt_params__7380.invoke(core.clj:486) at clojure.core$map$fn__4087.invoke(core.clj:2434) In fact, I'm not sure this will work at all, since (type) doesn't appear to work with non-native JS objects. Is the extend-type method feasible? Cheers, Stuart -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: cljs-clj interop
OK, unless there's some way to set arbitrary properties on a Java object, I guess this isn't possible... ClojureScript:cljs.user (aset js/Packages.clojure.lang.IFn prototype (js/Object.)) Error evaluating: (aset js/Packages.clojure.lang.IFn prototype (js/Object.)) :as (Packages.clojure.lang.IFn[\prototype\] = (new Object()));\n org.mozilla.javascript.EvaluatorException: Java class clojure.lang.IFn has no public instance field or method named prototype. (cljs repl#9) at cljs repl:9 (anonymous) at cljs repl:9 On 31 December 2012 09:41, Stuart Campbell stu...@harto.org wrote: Ah, you're right -- thanks. That leads me to another error: ClojureScript:cljs.user (extend-type js/Packages.clojure.lang.IFn IFn (-invoke ([this] (.invoke this Error evaluating: (extend-type js/Packages.clojure.lang.IFn IFn (-invoke ([this] (.invoke this :as Packages.clojure.lang.IFn.prototype.cljs$core$IFn$ = true;\nPackages.clojure.lang.IFn.prototype.call = (function (this_sym23394){\nvar this_sym23394__23395 = this;\nvar this__23396 = this_sym23394__23395;\nreturn this__23396.invoke();\n});\nPackages.clojure.lang.IFn.prototype.apply = (function (this_sym23392,args23393){\nreturn this_sym23392.call.apply(this_sym23392,[this_sym23392].concat(args23393.slice()));\n});\n org.mozilla.javascript.EcmaError: TypeError: Cannot set property cljs$core$IFn$ of null to true (cljs repl#25) at cljs repl:25 (anonymous) at cljs repl:25 (anonymous) at cljs repl:25 I'll keep investigating. On 30 December 2012 12:31, David Nolen dnolen.li...@gmail.com wrote: I think you've just formatted your code incorrectly. Did you try something like this? (extend-type js/Packages.clojure.lang.IFn IFn (-invoke ([this] (.invoke this)) ([this a] (.invoke this a))) ) On Sat, Dec 29, 2012 at 8:22 PM, Stuart Campbell stu...@harto.orgwrote: Hi all, I'm toying with a way to use Clojure objects from a Rhino-based ClojureScript environment (https://github.com/harto/rhino-bridge). I've been able to export a Clojure function into the ClojureScript environment without too much difficulty. Ideally, I'd like to be able to call that function as if it were a regular ClojureScript function. I was hoping I could do something like: (extend-type js/Packages.clojure.lang.IFn IFn (-invoke [this] (.invoke this)) (-invoke [this a] (.invoke this a)) ;; etc ) However, this yields an error that I don't quite understand: java.lang.UnsupportedOperationException: nth not supported on this type: Symbol at clojure.lang.RT.nthFrom(RT.java:846) at clojure.lang.RT.nth(RT.java:796) at cljs.core$extend_type$assign_impls__7365$fn__7377$adapt_params__7380.invoke(core.clj:486) at clojure.core$map$fn__4087.invoke(core.clj:2434) In fact, I'm not sure this will work at all, since (type) doesn't appear to work with non-native JS objects. Is the extend-type method feasible? Cheers, Stuart -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: Strange behavior with future
Laziness might be your problem, but that wouldn't explain (println called) working without a deref. Can you show a bit more code around this call to `future'? On Sun, Dec 30, 2012 at 8:31 AM, Oskar Kvist oskar.kv...@gmail.com wrote: Hi! I'm trying to play a sound in my application, using http://www.javazoom.net/javalayer/documents.html that lib. Anyway, I tried playing the sound in a future, so the main thread would not block while playing, like so: (future (- in Player. .play)). But if I don't deref the future, the sound does not play. If I do deref it, the sound plays, but I have to wait for it, which is what I wanted to avoid. If I do (future (do (println called) (- in Player. .play))), without a deref, it prints called but does still not play the sound. If I do (future (do (- in Player. .play) (println called))), without a deref, it neither prints nor plays. What could be wrong? I'm using clojure 1.4.0 and `lein trampoline run -m ns/main` to run my program. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: What would you use a #[] data literal for?
Wouldn't it be better to implement this as an automatic optimization, just like PersistentArrayMap vs PersistentHashMap ? fwiw, I'm cautiously in favor of #[] being used for queues. On Sunday, December 30, 2012 3:45:24 AM UTC-8, Jozef Wagner wrote: I use it in Clojurescript for a custom tuple type. For small number of items, deftypes are way faster to create and access than PersistentVectors. I use tuple type e.g. for returning multiple values from a function. Implementing #[] allowed me to have a compact syntax for creating and destructuring such tuples. (defn foo [a b] #[(+ a b) (- a b) (* a b)]) (defn foo [] (let [#[plus minus times] (foo 1 2)] (str bla bla plus blaah minus))) JW On Friday, December 28, 2012 11:15:52 PM UTC+1, vemv wrote: I was just wondering - given that we have the #() and #{} literals, why not a #[] as well? Queues look like a good fit. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: What would you use a #[] data literal for?
You can also patch the LispReader in jvm Clojure without dropping to Java. Here's an example of that to add a #b reader literal: https://github.com/dgrnbrg/piplin/blob/master/src/piplin/types/bits.clj#L216 On Sunday, December 30, 2012 7:38:44 AM UTC-6, Ambrose Bonnaire-Sergeant wrote: Jozef, How do you achieve that? Thanks, Ambrose On Sun, Dec 30, 2012 at 7:45 PM, Jozef Wagner jozef@gmail.comjavascript: wrote: I use it in Clojurescript for a custom tuple type. For small number of items, deftypes are way faster to create and access than PersistentVectors. I use tuple type e.g. for returning multiple values from a function. Implementing #[] allowed me to have a compact syntax for creating and destructuring such tuples. (defn foo [a b] #[(+ a b) (- a b) (* a b)]) (defn foo [] (let [#[plus minus times] (foo 1 2)] (str bla bla plus blaah minus))) JW On Friday, December 28, 2012 11:15:52 PM UTC+1, vemv wrote: I was just wondering - given that we have the #() and #{} literals, why not a #[] as well? Queues look like a good fit. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clo...@googlegroups.comjavascript: Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+u...@googlegroups.com javascript: For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: abysmal multicore performance, especially on AMD processors
I've posted a patch with some changes here (https://gist.github.com/4416803), it includes the record change here and a small change to interpret-instruction, the benchmark runs 2x the default as it did for Marshall. The patch also modifies the main loop to use a thread pool instead of agents and allows you to set the number of threads, this might help diagnosing the parallel performance issue. On the modified benchmark I'm seeing ~4x speedup with the parallel version on an 8 core machine and the profiler reports that the parallel version is using twice as much cpu time. I also had another look at the native calls issue modified the clojure runtime to avoid most to the calls the profiler said were taking significantly more time in the parallel version, it did speed things up but only by ~6%, not the large margin the profiling results had led me to believe were possible, it looks like the profiler overstates these methods times. The modified clojure 1.5 is available here https://github.com/cdorrat/clojure/commit/dfb5f99eb5d0a45165978e079284bab1f25bd79f if anyone's interested YourKit is reporting that a number of clojure.core functions are taking longer in the parallel version than the serial and they all seem to be methods that have one or more instanceof or instance? calls but given the results above I'm not sure how much weight to give this. It's seems the elephant is still in the room and responsible to ~50% of the cpu time :) Cameron. On Saturday, December 22, 2012 10:57:28 AM UTC+11, Marshall Bockrath-Vandegrift wrote: Lee Spector lspe...@hampshire.edu javascript: writes: FWIW I used records for push-states at one point but did not observe a speedup and it required much messier code, so I reverted to struct-maps. But maybe I wasn't doing the right timings. I'm curious about how you changed to records without the messiness. I'll include below my sig the way that I had to do it... maybe you can show me what you did instead. I just double-checked, and I definitely see a 2x speedup on Josiah’s benchmark. That may still be synthetic, of course. Here’s what I did: (eval `(defrecord ~'PushState [~'trace ~@(map (comp symbol name) push-types)])) (let [empty-state (map-PushState {})] (defn make-push-state Returns an empty push state. [] empty-state)) Still, I guess the gorilla in the room, which is eating the multicore performance, hasn't yet been found. No, not yet... I’ve become obsessed with figuring it out though, so still slogging at it. -Marshall -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: Strange behavior with future
Ok, here is some more code: The line (- in Player. .play) nil)) in the first function is what I'm trying to wrap in a future. The first two functions are basically what is used when trying to play a sound. The other 3 is the main loop part of my program. I don't think anything else is relevant. (defn play-mp3 [name] (with-open [in (jio/input-stream (str audiodir name .mp3))] (- in Player. .play) nil)) (defn play ([words-map] (play words-map 1)) ([words-map n] (let [mp3-n (min (Integer/parseInt n) (:mp3s @last-info))] (if (and @last-word (pos? mp3-n)) (play-mp3 (str @last-word mp3-n)) {:output play what?} (def cmds (let [cmds [add delete random show help play] cmds (zipmap cmds (map #(ns-resolve 'dictionary.core (symbol %)) cmds))] (conj cmds [key pron-key] [lookup lookup-cmd]))) (defn handle [cmd] (let [[cmd args] (str/split cmd #\s+) matching (starts-with-in cmd cmds)] (when (= 1 (count matching)) (let [{:keys [output new-words-map]} (apply (val (first matching)) @words-atom args)] (if output (println output)) (if new-words-map (reset! words-atom new-words-map (if (and (or (.startsWith exit cmd) (.startsWith quit cmd)) (pos? (count cmd))) false true))) (defn -main [ args] (def words-atom (atom (load-words))) (loop [] (print ) (flush) (let [cmd (read-line)] (println) (when (handle cmd) (println) (store-words @words-atom) (recur (shutdown-agents)) On Monday, December 31, 2012 12:12:09 AM UTC+1, Moritz Ulrich wrote: Laziness might be your problem, but that wouldn't explain (println called) working without a deref. Can you show a bit more code around this call to `future'? On Sun, Dec 30, 2012 at 8:31 AM, Oskar Kvist oskar...@gmail.comjavascript: wrote: Hi! I'm trying to play a sound in my application, using http://www.javazoom.net/javalayer/documents.html that lib. Anyway, I tried playing the sound in a future, so the main thread would not block while playing, like so: (future (- in Player. .play)). But if I don't deref the future, the sound does not play. If I do deref it, the sound plays, but I have to wait for it, which is what I wanted to avoid. If I do (future (do (println called) (- in Player. .play))), without a deref, it prints called but does still not play the sound. If I do (future (do (- in Player. .play) (println called))), without a deref, it neither prints nor plays. What could be wrong? I'm using clojure 1.4.0 and `lein trampoline run -m ns/main` to run my program. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clo...@googlegroups.comjavascript: Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+u...@googlegroups.com javascript: For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en
Re: Strange behavior with future
Oh, now I understand! I close the stream (in the with-open) in the main thread before the other thread got a chance to play it. On Monday, December 31, 2012 3:49:25 AM UTC+1, Oskar Kvist wrote: Ok, here is some more code: The line (- in Player. .play) nil)) in the first function is what I'm trying to wrap in a future. The first two functions are basically what is used when trying to play a sound. The other 3 is the main loop part of my program. I don't think anything else is relevant. (defn play-mp3 [name] (with-open [in (jio/input-stream (str audiodir name .mp3))] (- in Player. .play) nil)) (defn play ([words-map] (play words-map 1)) ([words-map n] (let [mp3-n (min (Integer/parseInt n) (:mp3s @last-info))] (if (and @last-word (pos? mp3-n)) (play-mp3 (str @last-word mp3-n)) {:output play what?} (def cmds (let [cmds [add delete random show help play] cmds (zipmap cmds (map #(ns-resolve 'dictionary.core (symbol %)) cmds))] (conj cmds [key pron-key] [lookup lookup-cmd]))) (defn handle [cmd] (let [[cmd args] (str/split cmd #\s+) matching (starts-with-in cmd cmds)] (when (= 1 (count matching)) (let [{:keys [output new-words-map]} (apply (val (first matching)) @words-atom args)] (if output (println output)) (if new-words-map (reset! words-atom new-words-map (if (and (or (.startsWith exit cmd) (.startsWith quit cmd)) (pos? (count cmd))) false true))) (defn -main [ args] (def words-atom (atom (load-words))) (loop [] (print ) (flush) (let [cmd (read-line)] (println) (when (handle cmd) (println) (store-words @words-atom) (recur (shutdown-agents)) On Monday, December 31, 2012 12:12:09 AM UTC+1, Moritz Ulrich wrote: Laziness might be your problem, but that wouldn't explain (println called) working without a deref. Can you show a bit more code around this call to `future'? On Sun, Dec 30, 2012 at 8:31 AM, Oskar Kvist oskar...@gmail.com wrote: Hi! I'm trying to play a sound in my application, using http://www.javazoom.net/javalayer/documents.html that lib. Anyway, I tried playing the sound in a future, so the main thread would not block while playing, like so: (future (- in Player. .play)). But if I don't deref the future, the sound does not play. If I do deref it, the sound plays, but I have to wait for it, which is what I wanted to avoid. If I do (future (do (println called) (- in Player. .play))), without a deref, it prints called but does still not play the sound. If I do (future (do (- in Player. .play) (println called))), without a deref, it neither prints nor plays. What could be wrong? I'm using clojure 1.4.0 and `lein trampoline run -m ns/main` to run my program. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clo...@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+u...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en