Fork me on GitHub

Is there something like take-while that can stop when an infinite lazy sequence reaches a fixed point? For context, I'm using iterate to generate the result of applying f to x as many times as needed, and I expect this sequence to eventually reach a fixed point, and I'd like to return that.


Like, say the sequence will produce x, y, and z, but then (= (f z) z), so the sequence keeps producing zs forever, and I'd like to return that z value.


In particular, while take-while examines only a single element at a time, it seems like the answer to a fixed point question requires a sliding window of history. This seems like it should be possible with some amount of partition trickery, but I was hoping there was some built-in solution for "iterate f on x until fixed point" or similar.


Can you reduce your sequence after take-while finishes?


Also there is reduce to reduce a sequence to a single value.


Yea, that's definitely possible, but the function passed to reduce would have a certain amount of complexity in tracking the trailing window of history etc.


maybe partition first, for the sliding window?


That's probably my next best option, if there isn't some sort of built-in sequence function relevant here.


It seems like take-while / drop-while are almost but not quite what I want, but the difference is not one I can easily work around.


@johnnyillinois Thank you for the suggestions.


Hello all, the expression (doall (pmap #(some %) collection)) wait for all some results but only starts 6 threads in my cpu if I have more than 6 elements in collection. I´ve tried to use (doall (map #(future (some %)) collection)), that starts all threads but the results is async. Is there any way to start one thread per collection element and wait for all response like in pmap?


how many cores does your CPU have?


I saw in pmap source that is core + 2 threads


What about creating all the futures and then deref-ing them all?


Sorry that I don't have the exact syntax for this.


🙂 that´s I don´t know how


the results is important to wait all together because I´ll analyse the results after


I don't know the exact details but I think this page has some good starting points.


In particular, I suspect you can do something with doall, map, and force.


But, again, I'm uncertain of the specifics.


thanks @mingp I´ll read it to see if it will help me


You're welcome.


BTW, in case anyone was curious as to my earlier question, I came up with this:


(defn fixed-point-of-seq
  (if (= (first input) (first (rest input)))
      (first input)
      (recur (rest input))))


Could probably use some better error handling, but I think the general idea is there.


FYI, @fabrao if you only have 4 cores, you may not get much (if any) more throughput from more threads


@johnnyillinois so, using simple pmap will be the use for this.


Yeah, I mean unless each of the functions need to do something to show a user there is forward progress, I would just use pmap


Also, if you really wanted executing all in a separate thread.

(let [fs (future (my-f))]
   (reduce (fn [state f] (my-r-f state @f)) [] fs))


interesting johnny, so reduce will sync all to wait for results?


If the function to map over the collection is just some? then pmap will certainly be slower than map @fabrao


@fabrao no reduce is a normal function


@f ; will block until thread finishes 
Like @joshjones is implying "Are you sure you need all these threads?"


But the #1 rule of pmap's just a single letter. map vs pmap, throw in pmap test and see if it's faster. 80% of the time it works every time.


Two things to consider for pmap. One is computational intensity. If the CPU cost is higher than that of thread creation overhead plus computation (and you might be surprised at how hard it is to perform a non-contrived, useful CPU-intensive operation using a few core clojure functions), it's a good candidate for pmap. The other is frequency of the call to pmap. Paralleling a computation in isolation is one thing, but if you have to repeat this parallelization frequently, then there will be trade-offs. If you're running a server that receives several hundred or thousand requests per second (or even tens maybe), for example, pmap will speed up one response, but the computation will tie up cores that could be used serving other requests. So you can serve some requests very quickly, but at the expense of others, which will be slower than had you not parallelized the operation. In other words, there is no free lunch.


In order to make some algorithms faster, I'm considering using runtime compilation via eval. Are there known downsides / caveats to this approach ?


@val_waeselynck I'm not aware of any downsides other than more difficult to understand code, but I'm no export. I would be interested in seeing how you could make something faster using eval though


@bfabry I wouldn't be the first to do this. For instance: * Plumatic/plumbing uses this technique for eager graph compilation ( * Specter uses this for dynamic path compilation ( * I think I heard in a talk Rich Hickey hint that Datomic's Datalog query engine uses eval for compiling queries.


The fact that it's faster boils down to being able to leverage the JVM's JIT I believe


The kind of issues I'm looking to be warned against are things like memory leaks, race conditions, interferences w/ direct linking, etc.


totally, there are definitely situations where explicitly creating a code tree and eval'ing it will end up faster than an algorithm that works with a data structure, I was just curious as they're usually really interesting cases. specter and plumatic are great examples


I have to make a url like this : http://localhost:3000/detail/&lt;id&gt; . Must I do it like this url = (str /detail id) <a href = url > in selmer


Hi, I'm using the defun macro to define a function with pattern matching. As you can see the function accepts an options map:

(defun foo
  ([{:a a :b b}]
   (str a b))

  ([{:a a}]

(foo {:a "foo" :b "bar"}) ;; => "foobar"
Is it possible to use destructuring to bind the whole options map to some-symbol within the parameters definition?

Alex Miller (Clojure team)15:12:35

Quick reminder that the Clojure community survey closes Friday - would love to have your input!


Maybe I missed the memo, but I'm seeing lots of 404s on the clojure documentation pages, e.g.; or;&gt;


Did someone change the regex on the allowed/recognized URLs? 🙂


Hello, all. Does anyone have any good recommendations for test assertion matchers, something like the Clojure equivalent of Hamcrest et al? I'm using vanilla clojure.test, and had been playing with matcha ( but it felt a little incomplete. It looks easy to extend and I'm quite happy to start writing other matchers, but I wondered if there was some other library that I've missed. Googling around hasn't thrown up too much, so any advice would be great.


@stubillwhite not completely sure what that library does ^^


Cursive has some nice clojure.test integration that ties into the IDE's text differ


clojure.test + cursive gets you this: which handles about everything I need.


I'm sure similar stuff probably exists in Cider as well.


Ah, I see. Haven't played with Cursive -- I'm currently Emacs/Cider -- but I keep meaning to as it's what coworkers will probably use. Looks nice. I'm actually looking for a library that does fuzzy matching for tests, so I can assert that (say) the result of a function is a list containing item1, item2, item3, but I don't care about the order, or that a number is approximately equal to an expected value plus or minus some delta. Hamcrest ( does something similar in other languages and there are a few similar libraries in Java. I could easily write my own, I'm sure, just checking whether that's what people are usually doing, or whether there is a neat library with some prewritten matchers like that. Matcha does that, but seems to be missing a few common ones I'd expect to see. Maybe I'll go with that and see if I can extend it.


So for the first, I normally use sets for that: (is (= (set test-data) #{1 2 3}))


For the other, I may use <= or >= but honestly I haven't hit that problem, even when building systems for rather large retailers and financial institutions. Most of the time you can either query for the answer from an existing dataset, or hard code the test to some value.


I know it's possible to have problems where perhaps the code gets tripped up on precision of Doubles but I haven't seen that in practice. Perhaps mostly because the JVM is consistent across OSes?


Oh, that's not the problem at all, just an example of where I don't care about the exact precision of a calculation. I'm looking to make loose assertions about code in some cases, and not impose a particular implementation on the thing under test because I want the tests to be a little more flexible.


Using a set for that particular example is easy enough; I can quite easily write my own common functions for doing this kind of thing. It's just that libraries in other languages for this are quite common, and Clojure seems to have a few. Midje ( has some of what I'm talking about, but I don't really want to use the rest of Midje as I'm preferring vanilla clojure.test.


I was wondering if maybe there were libraries out there I was missing but maybe not. Clojure is powerful enough that writing this kind of thing is cheap and easy, so maybe that's what people are generally doing.


Thanks, though. And I like the Cursive stuff -- I will check that out to make the sales pitch to colleagues a little easier 🙂


you could make a multimethod close-enough that dispatches on its type of first argument and ensures that for whatever type it's "close enough" for that type


ie, for long its equal, for double within some epsilon, sets they are subsets of each other, etc


I'll have a play and see.


Okay, so honest question, why don't you care about exact precision? I ask because I see this feature in a lot of test frameworks, but I've never found a case where I didn't care about a number being exact?


Is the use case for non-financial uses or something? Admittedly about 99% of my uses of floating point numbers are for currency, where precision always matters.


does java not have an equivalent type of decimal like on .NET?


and that's guaranteed precise to some digits?


decimal doesn't have problems representing .1 + .2, etc


That's correct.


i'm from .NET land at work so I am pretty lost in the jvm ecosystem


@dpsutton I hear you there, I came from .NET. I had may moments of "Why is it DataOutputStream instead of BinaryWriter?!?!?"


yeah. I need a good overview of common utility classes in .NET


I've got safari and pluralsight through work so i should really look into an overview for java targeted for people not new to coding


nothing worse than trying to get up to speed with a language and it holds your hand about what variables and for loops are


@dpsutton, clojure has a literal syntax for bigdecs: 1.23M


thanks for the info!


@dpsutton in clojure, (rem 2.3 1) yields 0.29999…, whereas (rem (bigdec 2.3) 1) yields the correct 0.3M, as an example. annoying, yes


Is there a better way to convert from a map to a vector than this? (flatten (apply vector {:foo :bar :baz :qiz}))


(mapcat identity {:a :stuck_out_tongue: :c :d})


(mapcat identity the-map)


rofl, I fail at life.


user=> (apply concat {:foo :bar :baz :qiz})
(:foo :bar :baz :qiz)


awesome, thanks 🙂


or the faster (reduce-kv conj [] m)


Not by a long shot @reborg, at least with large maps. quick-bench from criterium shows, on a 50K k-v map defined as (def m (apply hash-map (range 100000))), that your reduce-kv takes 10ms, which is about 30000x slower than (apply concat m) (347ns) and 15000x slower than (mapcat identity m) (748ns)


now try it with transients 😉


@joshjones you’re correct, only for small maps


although we have to realize what "faster" is here


most of these solutions are lazy and aren't even doing anything


Sounds like me in the evening 😄


my data is maps of uuids to maps, which contain uuids as values, so a graph of uuids, do you think it's better to use strings for the uuids or symbols


That is a great point @tbaldridge — depending on the subsequent operation on the result, it may be a big time saver, or not at all. Fully realizing the lazy sequence shows the reduce-kv case to be slightly faster for a large data set, however, whether you would fully realize the result or not is a case-by-case scenario. :thumbsup::skin-tone-2:


Personally, I’d take the chance, if I did not know, to have the lazy seq so I can at least have the option to save some time


I would choose readability and developer simplicity over "performance" as long as I do not know at all where my performance bottlenecks are. Everytime I think, oh, I could write this function faster I stop and rethink about it if I loose something else for it and usually just let it be.


tried transients?


i have more processes than i can reasonably decide resource usage for, do we have any abstractions written over usage of resources like memory and processing so i could give my processes chits they can exchange for cycles instead of deciding directly what resources to use on them


that is a queue, so core.async channels or java.util.concurrent queues


what you are describing is a scheduler, which tend to be written around a run list or run queue


my sketch in my mind goes like, auction resources for chits (with one of the resources auctioned being more chits (else my processes will spam my resource allocator to death)), so if you have 3 chits you can say "bid 2 chits for a processing block" and if you won you'd be returned info about when you're scheduled to process and deducted the chits


that's way more complex than you need


that is a priority queue


queues with fixed sizes will give you most of what you need


need for what? i want to dump an unlimited number of processes on it from various producers and resolve all the contention? my use case is evolving processes, they mutate and divide, so there's always necessarily more of them than any resource provided to them


That's the problem, don't dump processes, dump messages or data at a fixed number of processes, extra messages are queued in memory or disk


you are describing a work queue


or preferably on a distributed queue where they can be load balanced across machines.


i tried reading stuff from academia and it always just assumes i can let the producers send messages to the allocator, if i let my producers freely send messages they'd grow until clogging that pipe was their bottleneck, so i have to hand out a fixed number of opportunities to bid for resources, do you know any papers about that


anyway i'm assuming i have to write up the chit system myself, but what abstractions are there i can feed into it? like what's an abstraction of "some processing" that i could take bids for?


mapping N processes to M cores where N > M is basically all scheduling is about


@mungojelly I would assert that your premise is incorrect. This "clogging the pipe" you mention is a feature, it's known as backpressure, and it's a tool that can be used to tell producers "hey slow down a bit!". You'll still have to deal with this clogging anyways, since a scheduler has a finite set of resources. If it decides that a consumer doesn't get resources, then that consumer is going to not process its inputs and the producers will "clog" anyways.


in my case N is always increasing unreasonably, which breaks assumptions in most of the models i've read, but i can solve that easily enough i think by just handing out a fixed number of opportunities to bid on scheduling


that doesn't break the model


that is literally what people model


my producers can't be told to slow down a bit, there are necessarily more of them than can fit and they all desperately need processing to survive, they have genuinely contending needs


But they will anyways, if they bid and fail...what are they going to do/


then they'll die


sounds like you need more consumers then to deal with the load


or a real-time kernel, and most certainly not the JVM


no, the whole basic idea is to have more producers than can survive, they're supposed to have unresolveable contention


So now I'm wondering, what sort of system is this?


i call them evolving processes


a priority queue where entries expire


the distinction from genetic algorithms is mostly that they're not inherently random, the "mutation" step is intentional change


i think i'm ok on what type of queue to use, really, what i'm going to do is hand out a specific finite number of resource chits, and then go back to those finite number of places and find out how they wanted to bid their chits, which can include asking for more chits as one of the resources, and i'll just sell as many chits as i can throughput, my question was what abstractions i can put up for them to buy


are memory and processing not abstracted into first class values somehow somewhere? can't i take processing a thing for a while as a thing and work with it??


i could make my own abstraction, like, um, what i thought of was just sell processing slices, they run for X milliseconds, make various sizes of them, and you can rent memory for them to work with


but that feels like i don't really know what i'm doing, trying to throw together an abstraction of some processing like that, so i was wondering if there are any such abstractions already that would be good for me to sell


sounds like aws lol


you can most definitely abstract out anything you want, including a hardware resource — but it’s not a first class “thing” in any programming language — most definitely a “roll your own” (if i’m even in the same universe of what you’re talking about)


yeah it's a similar concept to cloud computing but on a micro scale i guess, i want my processes to requisition little cloud computers from me but they're very VERY small computers that have like, a few k of memory and they only last three seconds or whatever


for abstracting a fixed amount of memory is the best thing a java ByteBuffer? there's no higher abstractions about memory usage on the clojure side?


Has anybody here read The Joy of Clojure? Would you recommend it?


Yep, Joy of Clojure is great. I recommend it after you've gotten your feet wet, though, as it's a pretty aggressive from the get go. I usually tell people to start with Clojure for the Brave and True and then after you've gotten some experience go through Joy of Clojure.


Just my $0.02


Yes: I really liked Joy of Clojure … I agree with @manderson


I went through Living Clojure by Carin Meier. I think I understand the basics (though the lazy nature sometimes bites me). I am looking to get into the idioms of the language now.


Joy of Clojure should be good for that.


Thank you 😄


hello clojurians, are clojurec ( ) and clojure android dropped ? looking for some language to support both ios and android also functional but it seems like clojure tools are dropped


Clojurescript works great on both


yes I know about clojurescript, was thinking about closer implementation to native


downloading javascript runtime and running app on top of it seems.. strange 😉


iOS and android come with really good is runtines


dont know about iOS, since I work with android everyday. not sure if we’re on the same page, are you talking about react native with clojurescript?


@charafau I am actually working on exactly what you describe. Unfortunately, those other projects look abandoned. I can let you know if i have something you can use


I’m currently tinkering with react native which is not as good as they describe


Hey, plus the javascript bindings when working with WebViews are error prone and hard to debug


maybe clojure with xamarin ?


Does xamarin build with normal webpages?


Cause yeah that might be your best bet


xamarin doesnt use webpages


I was thinking about CLR version of clojure


can someone point me to a good resource on list-like collections? for example: what’s the idiomatic way to check “if vector or list?” — sequential?? are there any data structs other than those two that implement Iseq, etc.?


(defn vec? [o] (= (class o) clojure.lang.PersistentVector))) ; for example a vector
You can checkout: and search for the data structures


No, use sequential? To check for a vector or a list


Sequential? Also catches all the iseq impls


is there a way to parse multiple xml documents from a single file using data.xml? when I pass it a reader it seems to consume past the first document


it’s possible to refer specific symbols using aliases? e.g (require ‘[clojure.string :refer [replace :as replace*]])?


oh, I guess I’m gonna have to use :rename?


yeah use rename


when i have some data that's semantically triplets, like none of the things are the primary thing they're just all related, there's no way to say a triplet directly is there, so how should i decide whether to say {:a [:b :c]} or {[:a :b] :c} or what


Use a hash set?


if you're using them a bunch it may be worth it to define your own type and define an equality


maybe implement ILookup or whatever the "get key value" interface is


hmm, yeah, maybe what i mean to say is more like #{ {:op :a :0 😛 :1 :c} {:op :d :0 :e :1 :f}}, i'll try that, thanks, i've seen several videos of you btw @tbaldridge and they were really useful to me thank you


@mungojelly ther's a config to turn off emoticon conversion, btw


also :0 and :1 are terrible keywords, I hope you aren't really using such things


not only terrible, but invalid, i believe


well no but i did use :a and 😛 for something similar recently and that didn't seem good either-- what would you recommend there? for like there's an operation and two operands, what should the keys for the operands be


@robert-stuttaford the repl accepts them, trying to look up the ctual legality


:a and 😛 are fine


i think i had issues with starts-with-a-number keywords before


:b - much better


(the config is per slack)


;; A keyword string, like a symbol, begins with a non-numeric
;; character and can contain alphanumeric characters and *, +, !, -,
;; _, and ?.  (see  for details).


so not legal per the docs at least


it worked fine for me using :a and :b for the operands but then when i wanted to add an arity three operation and put :c i started to feel like, surely there's something more elegant i could be doing here


my biggest shame in my own production app is that someone decided unconditionally turning all keys into keywords in incoming json was mandatory, so now we have keywords like :11112223322 floating around the app


@noisesmith if that's a public API that's a DoS vector


@bfabfry among other issues, but no we don't decode from incoming requests that way gladly


it's in converting responses


I heartily disrecommend the "it's a key in a hash-map so it needs to be a keyword" thing though - terrible idea with terrible consequences


btw sorry for complaining but as a lojban speaker the )))))))))) around here really doesn't seem reasonable, everyone in the world is saying that's silly and i really think it is, in lojban we sometimes practice with beginners by putting all the terminators on tuesdays, we call it Terminator Tuesdays, and here i feel like it's Terminator Tuesday every day, why not something like <<def something [stuff] (blah (blah blah stuff) blah (blah blah blah>> at least :/




@mungojelly Not sure if you are joking, but are you suggesting to replace paranthesis by different mathematical symbols? 😄


no i'm not joking at all, ))))))))))) is clearly silly, a simple fix would be to have an optional parenthesis that terminates up to that parenthesis when you close it closing all internal parentheses, like if it were << >> then <<open (something (stuff stuff (done>>


i know it's not going to change any time soon but i just feel so silly saying )))))) all the time and it seems like i should say something about how ridiculous it is, if my editor didn't help it would hurt my brain every time i ended a sentence


have fun implementing your terrible idea, but I promise you aren't going to get clojure people to use it


Not only will it not change any time soon, it will not change :thumbsup::skin-tone-2:


Amazing reply by a man named @noisesmith


Sine we're talking about noise


Lisp has survived for 58 years partly by being syntactically simple. Let’s not even suggest something which would be completely orthogonal to its purpose


i feel like it's more a collective denial, i mean everyone in the universe tells you all the time that )))))))) is silly, and there's little evidence that it isn't a blocking concern given that hardly anyone speaks lisp. even the original plan for lisp wasn't to say )))))))) that was just a hack that happened to work so they went with it for a few years until now. time to move on really.


have fun moving on, don't wait up


If you use an editor that manages parentheses automatically for you — and color codes them to pastel shades — then you don’t even see the closing ))))...


And, frankly, if you look at non-Lisp languages, you have as much punctuation, you just tend to have styles that put all the closing punctuation on separate lines...


@mungojelly coming into a lisp chat room and saying lisp is silly seems a little counter productive. as sean says, most editors essentially do what you're saying at the ui layer, by making the closing parentheses unobtrusive


sure well that's the terminator you're using instead of actually saying ))))))))) is newlines or indentation changes, and then parinfer or whoever turns it into the unspeakable format, which works ok for typing but there's no way to speak it and you still have lots of visual noise


i guess we won’t be able to use voice recognition for programming like most developers do then...


the spoken form seems to mostly use pauses to show the grouping, but it doesn't work very well and you mostly can't say anything without a projector


Uhm, when did you actually read code aloud? Usually I talk about namespaces, functions and logic...


"open parenthesis" is completely unspeakable, you could easily enough change it to "open" or just "op" but then you couldn't really say "clo clo clo clo" at the end of sentences

mpenet20:12:56 good point. Wouldnt any ring app using wrap-kw-param be vulnerable to this


I think the fact that we don't use a deterministic hash that restarts with each request mitigates this, at least


what i hear a lot in podcasts and such is people just saying "of course we can't say code since this is just audio" which is just sad, that's just complete surrender, and there's no need for it, clojure could easily be speakable with just another pair of parentheses or two that close things off for you


people usually talk about code in terms of patterns, ideas, algorithms ... i don't think people would speak code line by line even if it were feasible to do so


There's two points I'll make on that 1) as Sean mentioned Clojure has very few parens, and the ones it has are just in different positions from C#/Java/JS.


I can’t honestly think of a situation where I’ve ever wanted to speak code aloud


clojure as a declarative language is actually far more "speakable" than most imperative ones


i've heard people say that php is unspeakable despite being a c style language


But 2) the biggest thing for me is that lisps let me program via ASTs. When I write Clojure code I am writing data that the compiler interprets. Raw data that can be tweaked just like any other data. I've needed that feature way more often than I've needed the ability to speak.


Yep, thats what I mean, I just imagine a podcast where people speak java code aloud: class FooBar curly braces private static int someVariable = 3 semicolon linebreak public FooBar paranthese open... 😄


so maybe the parentheses don't make it unspeakable


well it's a feedback loop, of course you don't speak code if you'd have to say "close parenthesis, close parenthesis, close parenthesis!" and there's no need felt to improve the spoken form if people don't speak it


pseudocode maybe


i thought chicken scheme had a way to say terminate all parens


honestly i just haven't typed a close parens in months


I write more close parens in java and python than I ever do in clojure


and i seem to recall chicken scheme being written by a lojbanist, so that would make sense :D


what is a lojbanist


someone who speaks lojban, a constructed language, in lojban we speak "code" as in unambiguous statements all day long, and it's very easy-- except if we try to say all the terminators, like ))))))), then it's hard to finish sentences


i don't care then, i guess


Anyone got a link to that talk where someone programmed Clojure in Emacs purely by voice?


Sounds like someone invented a spoken language that's incapable of expressing code.


It was a few years back… don’t know whether it was Strange Loop or Conj?


the only reason I know of lojban


> I use most of the time a text editor (which is emacs and an extension called emacspeak, which makes emacs talk), and a browser to look some internal pages of Google with documentation and stuff.


Hm, looking at example lojban I see this: "End of function" I believe I can say the same for clojure functions instead of clo clo clo clo?


i wonder what callback hell looks like in that


Oh, forget it, I looked at the english translation 😄


close block, new line, parens, close block, new line, parens, comma,


some js callbacks


> Lojban translation (to be improved)


@seancorfield it was StrangeLoop...2013?


that's some friends of mine trying to translate from c, not very elegant or anything but they thought they'd give it a try


i mean, its cool you're trying to create a completely unambiguous language


or become proficient in it or whatever


@sveri oh that's awesome, I think I've seen some BF code that was cleaner.


I mean, no offense and I dont mean to laugh about it. Its always interesting what people come up with, but, saying clojures parantheses are evil because they cannot be spoken in lojban and then looking at this I think it is way easier to learn clojure and use all the )))))


@tbaldridge that was my second thought after WTF too 😄


With my Admin hat on, I suspect that this discussion would do better in #other-languages since it’s starting to get a little close to ad hominem at this point?


it looks like binary in base five with only vowels used as the numerals


(and this channel is meant to be for technical discussion of Clojure)


lojban's grammar is pretty ornate and messy in places, i wouldn't recommend copying it in general, but just in terms of whether it's actually necessary to say ))))))))))) from lojban' perspective clojure is so blub, there's various options for how to not have that problem and clojure chooses none of them


but there are plenty of reasons clojure is syntacticly structured the way it is


ditto lisp in general


Folks, seriously, take this to #other-languages — I won’t ask again. (with my Slack Admin hat on)


but of course it's not changing today, or any time soon, i'm going to keep typing )))))) or having parinfer type it for me or whatever, but just it seems right to complain at all rather than simply accept it, it really is silly, we ought to fix it sooner or later


Does anyone know a nice way how to kill hanging after some timeout?


@honzabrecka - probably easier to use java.lang.ProcessBuilder to create a java.lang.Process and use the destroy method on that


afaik sh hangs until the process it invoked returns


@noisesmith I’ll give it a try, thanks


@honzabrecka trivial example

=> (let [builder (ProcessBuilder. (into-array ["sleep" "100000"])) proc (.start builder)] (.destroy proc))


nothing to import, since ProcessBuilder is in java.lang


another bonus, with ProcessBuilder you can interact with it via I/O in real time


@nwjsmith How are you able to read values from the transaction without committing?


Hello guys, am just getting into clojure and was wondering if proto repl is a good replacement for emacs, has anyone switched from emacs to proto-repl ?


if so, why ? apart from the data visualisation reason that proto repl provides


@pishty There’s a #protorepl channel that will better be able to answer that (but, yes, I recently switched from Emacs to Proto REPL, after years of Emacs and I’m pretty happy).


oh very interesting @seancorfield thank u for that info and sharing your preference


In the state of Clojure survey, question 17 uses numeric priority. Are higher numbers higher priority, or are lower numbers closer to the "first priority"


@arthur you can drag them, higher on page is lower numbers is more priority