This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2019-05-16
Channels
- # announcements (5)
- # aws (34)
- # beginners (145)
- # cider (48)
- # circleci (8)
- # clara (7)
- # clj-kondo (28)
- # cljs-dev (75)
- # cljsrn (4)
- # clojure (325)
- # clojure-czech (10)
- # clojure-europe (5)
- # clojure-italy (4)
- # clojure-nl (4)
- # clojure-spec (6)
- # clojure-sweden (3)
- # clojure-uk (70)
- # clojurescript (18)
- # clr (1)
- # community-development (2)
- # cursive (38)
- # data-science (7)
- # datascript (14)
- # datomic (22)
- # emacs (2)
- # figwheel (1)
- # fulcro (6)
- # graalvm (22)
- # graphql (11)
- # hoplon (12)
- # jackdaw (8)
- # jobs-discuss (16)
- # juxt (5)
- # leiningen (19)
- # luminus (5)
- # nrepl (2)
- # nyc (1)
- # off-topic (6)
- # overtone (2)
- # pedestal (10)
- # re-frame (6)
- # reagent (8)
- # reitit (1)
- # rewrite-clj (43)
- # ring (2)
- # shadow-cljs (124)
- # testing (1)
- # vim (22)
- # xtdb (77)
- # yada (4)
With something like ring, is it normal to layer your middleware from most app specific to most general?
(-> handler
middleware-a
middleware-b
middleware-c)
Yes, I normally stack them from application to configuration middlewares.
(-> handler
api-middleware-a
api-middleware-b
wrap-json-response
wrap-gzip
wrap-errors
;; etc...
)
I hope that make sense 🙂That will depend on where in the process you want the auth to apply. We've taken different approaches with different apps, depending on exactly what we need.
That makes sense. Thanks! After a bit of trial and error the sweet spot for me is between general configuration middlewares and the APIs.
Is there a macro library for supporting 'array syntax' in Clojure? If not, is it feasible to write one? How does a macro like that work - do you sort of deal with the list elements as strings and break them apart to understand what to do? This is something like what I had in mind:
(def a (double-array [1.0 2.0 3.0])
(macroexpand '(array-syntax a[0]) ; => '(aget a 0)
(macroexpand '(array-syntax a[0] = 4.0) ; => '(aset a 0 4.0)
You can actually cheat here by abusing the fact that the Clojure reader will read a[0] as the symbol a and the vector with one element 0
because there are places where you want a single thing, and the reader will not read in a[0] as a single thing
reader macros are not extensible for this very reason, because in other lisp people started to create new syntax constructions incompatible with code as data paradigm
Not sure I understand why that would break anything @hiredman. If the macro reads a then [0], seems like you can key off that appropriately in the simple cases specified
[0] is a vector of 1 element, multiple of such simple cases will make language unbearable to learn, look at scala's underscore
Yeah, sadly, clojure doesn't allow for reader macros, unlike Racket
Hi everyone, I have a memory leak problem with my clojure program, I am trying to debug it with yourkit however the heap usage does not change, I only see the ram usage increase constantly with htop
, not sure how to find where the leak is
yourkit has a lot more information than htop does. The VM will never allocate more memory than the maximum you configure at startup, you can use that config to make sure the vm doesn't misbehave, then use yourkit (or even visualvm) to figure out where the free ram under that limit went if it is running out
thank you, I found the problem, it came from me not freeing some tensorflow ressources
That's correct if it is in the last part. If you do ::foo/bar it will look up the symbol foo as an alias in your current ns
not sure where to put
<resources>
<resource>
<directory>src/main/clojure</directory>
</resource>
</resources>
if you're using a pom, I think that goes in <build>
hmm. I need to read an EDN file, assoc some stuff in it, and then spit it out… while maintaining comments
In Clojure: (xml/emit-str {:tag "{
hey, is anyone here working at juxt? need a hint on how to start a repl properly in the yada repo.
or even if you don't work at juxt 😛
@alexd have an ask in #juxt
@dominicm is a juxter iirc, and of course @malcolmsparks
ah, didn't see that channel
should be lein repl
though. Feel free to mail me at <mailto:[email protected]|[email protected]>
There's also a #yada channel
@alexd asking in #yada is the best place
Hello guys
i'm in situation which i need to make two things depend on each other for example: 1- write something to DB 2- if step#1 success write another something how can i make both behave like if they run inside one transaction, both must be success not only one?
maybe dosync will help here?
so maybe i create a ref object with initial val = false and when event#1 success i change ref to be true and make condition to run event#2 if ref is true?
or how better to make this?
This is not really a Clojure question. If db and thing 2 don’t actually support 2PC distributed transactions like XA, then you are in the world of effectively doing your own distributed transactions and managing your own rollback in the case of failure.
Refs don’t help you afaict
is there a nice way of getting data out of a map where the keys are not keywords? f.ex. get the map at the innermost level here {1 {3 {:key true}}
using keys that aren't keywords is fine - Strings, Numbers, even other hashmaps or sets. You can use the hashmap itself ({"a" 0} "a")
-> 0
, you can use get
which is the function that a keyword is actually calling when you use it as a function
keywords aren't a syntax for map lookup, they are just objects that know how to use get
the one thing you should never use as a hash-map key is anything with value equality that is mutable (eg. a java ArrayMap)
@alexmiller what do you mean i need to implement rollback methods if one of the events failed, suppose event#1 success and be inserted to the DB, and event#2 failed, then i need to run the rollback method to delete the record from the db which be inserted by event#1 ?
@abdullahibra depending on the DB you use, but usually modifications to the same row are serialized in the database, so you can safely wait for transaction #1 to finish, check the return value, then do #2
okay got it
thanks guys 👍
@restenb if transaction #1 success and then try to invoke transaction #2 which failed, then i need a rollback methods implemented for event#1 to roll back
i guess that's what @alexmiller means
I am not quite sure I understand what you are trying to do @abdullahibra
lemme explain in more details what i'm trying to do
i would like to save reference of objects into postgresql and save the actual objects into s3 for example
so i need to make 2 operations here
1- insert reference data into postgresql of the object 2- push the object itself into s3
i would like to make both run in one transaction, to make sure i pushed reference and the object, but not any of them
my try now is to handle the failure of any for any reason
@art got what i'm trying to do?
Well, it’s postgresql – in that case use transaction and if s3 upload fails roll it back, no?
you are right
what i missed postgresql has roll back, but everything clear
However the best rule to follow is trying to avoid writing to multiple destinations in a single user transaction because if the transaction fails because of other reasons after the file has been uploaded it needs to be deleted. In your case that does not seem necessary but still good to keep in mind.
Heya; I'm using leiningen and need some dynamic eval in project.clj to get the absolute path to the project.clj directory; I'm using:
["--verbose"
"--no-fallback"
"-Dclojure.compiler.direct-linking=true"
"-H:+ReportExceptionStackTraces"
"--report-unsupported-elements-at-runtime"
"--initialize-at-build-time"
"--enable-https"
~(fn [proj] (str "-J-Djava.security.properties=" (:root proj) "/java.security.overrides"))
"--rerun-class-initialization-at-runtime=org.bouncycastle.crypto.prng.SP800SecureRandom"
"--rerun-class-initialization-at-runtime=org.bouncycastle.jcajce.provider.drbg.DRBG$Default"
"--rerun-class-initialization-at-runtime=org.bouncycastle.jcajce.provider.drbg.DRBG$NonceAndIV"]
I was expecting that fn to be called with the project map, evaluating to a string, per https://github.com/technomancy/leiningen/blob/master/sample.project.clj#L347-L348 but clearly lein native-image isn't happy, because when I run it I get:
$ lein with-profile +client native-image
Error encountered performing task 'native-image' with profile(s): 'base,system,user,provided,dev,client'
java.lang.IllegalArgumentException: array element type mismatch
I tried to debug using lein pprint
, but instead it's just getting unquoted and so I get a literal function object in pprint (that might not be a bug? I'm not sure when the fn eval is supposed to happen):
:native-image
{:name "transgressor",
:opts
["--verbose"
"--no-fallback"
"-Dclojure.compiler.direct-linking=true"
"-H:+ReportExceptionStackTraces"
"--report-unsupported-elements-at-runtime"
"--initialize-at-build-time"
"--enable-https"
#object[leiningen.core.project$eval493$fn__494 0x1ec22831 "leiningen.core.project$eval493$fn__494@1ec22831"]
"--rerun-class-initialization-at-runtime=org.bouncycastle.crypto.prng.SP800SecureRandom"
"--rerun-class-initialization-at-runtime=org.bouncycastle.jcajce.provider.drbg.DRBG$Default"
"--rerun-class-initialization-at-runtime=org.bouncycastle.jcajce.provider.drbg.DRBG$NonceAndIV"]},
Any ideas? Do I need #= or whatever? (That wouldn't be great because I probably need the project map :))what is the simplest job scheduler lib you guys can recommend?
tried tick
from juxt but the scheduling feature is disabled right now
anyone seen this error before?
No implementation of method: :xml-str of protocol:
#'clojure.data.xml.protocols/AsXmlString found for class:
org.joda.time.DateTime
does anyone know of an alternative to jvisualvm
or jmc
that works with adoptopenjdk-12
?
that’s not yourkit 🙂
@rickmoynihan I dont' think I have your answer directly, but which set of features do you need?
cpu profiling/instrumentation
I know you asked about alternatives, but what is the reason jvisualvm
doesn't fit the needs?
it doesn’t ship with adoptopenjdk … and old versions won’t (for me at least) connect to an adoptopenjdk vm
if it worked it would fit my needs 🙂
@rickmoynihan there's HPROF if you don't need a UI or are comfortable with a fronted that loads its dump files
you tried https://visualvm.github.io/ ?
yeah I downloaded it and tried it
are you using the jvm arg for accepting a dt socket connection?
@noisesmith yeah I’d really like a UI… I can at a push use hprof, but it’s not as easy as clicking a start/stop button around your repl interaction
if you use clj + the hprof agent you can eliminate noise like nrepl from your measurements though
it's not very convenient though, agreed
@noisesmith: no… though you’ve made me realise it didn’t even get that far… I think it’s trying to use java 12 to load itself
this stuff used to be easy
hmm thanks for that… I tried passing the --jdkhome=/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/
but it displays an error screen saying please use jdk 8, 9, 10 or 11 — which is kinda annoying as I gave it the jdk 8 home
I also have JAVA_HOME
set to jdk8
ok installing the official release from that site, and starting it with the command:
./bin/visualvm -J-Dcom.sun.tools.visualvm.modules.startup.DisableStartupCheck=true
to disable startup checks at least starts up the UI.
No idea if it’ll work if I connect to something yet.
connecting to jdk8 vms works at least if you do that
ok you can get heap profiles on jdk12 — but you can’t access local samplers for CPU or memory 😞 — though you might be able to do it if you setup jmx 😞
yeah I don’t do the JMX stuff very often
so always need to consult what you need to do
I might be better building from master if that works
it likely will be… just seeing whats involved in building it from source
ahhh ant
well this is a fun trip down memory lane!
looks like the next yak is building netbeans… I might have to leave these unshaved
oh joy netbeans requires mercurial not and git
yeah i’ve aborted and am trying that now
I just have the fear because last time I did this I really struggled with RMI port stuff… but that was through a tunnel, so should be much more straightforward this time.
@rickmoynihan Not sure if this will help your situation, but when I’ve had network stuff get in the way of jvisualvm
, I’ve added this to my startup: -Djava.rmi.server.hostname=localhost
yeah I tried that this time too and it still didn’t seem to work
but I think that was the solution in the past
ugh cannot connect
:jvm-args ["-Dcom.sun.management.jmxremote"
"-Dcom.sun.management.jmxremote.port=9199"
"-Dcom.sun.management.jmxremote.local.only=true"
"-Dcom.sun.management.jmxremote.authenticate=false"
"-Dcom.sun.management.jmxremote.ssl=false"]
still failing to connect when trying localhost:9199
ugh giving up for the evening
is it by design that clojure.data.xml
preserves newlines like this?
(parse-str "<foo><bar/>\n<bar/>\n</foo>") ;;=>
{:tag :foo,
:attrs {},
:content
({:tag :bar, :attrs {}, :content ()}
"\n"
{:tag :bar, :attrs {}, :content ()}
"\n")}
it is by spec I believe
there is a flag to change this behavior though
is it relatively safe to use the newest clojure.data.xml? I really need the namespace stuff 🙂
I've used latest extensively without any issues
let me know if you run into a node which has the same name as its parent. There's a patch that I think shouldn't have gone in: https://dev.clojure.org/jira/browse/DZIP-3
:include-node? #{:element :characters}
, the question mark is a bit weird I guess. maybe it went from a boolean setting to a enumeration later?
What's going on here? I'm trying to get for
to work and I'm getting strange output for doing a simple (for [n (range 1 101)] (println n))
and getting this output:
(1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil 33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil 65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil 97
98
99
100
nil nil nil nil nil)
No idea why that didn't collapse
println
returns nil. you have a collection of 100 nils. Your repl is also printing the side effect interleaved
Why does for
behave this way?
for
is intended to return a value that is a sequence. It isn't really intended to perform side effects like printing in its body.
So then doseq
is intended for side effects?
doseq
is intended to iterate through a sequence and do arbitrary side effects on each one.
So in other words, for
is lazy?
it produces a lazy result, yes.
So my reason for asking is I never actually did FizzBuzz in Clojure and wanted to see how that looked. This works as expected, but it looks pretty bad. Is there a more concise way to do it?
my first thought would be using cond
instead of multiple if
s
cond
doesn't evaluate after something is true
I'm not sure what you mean by that
also, it's nicer to use zero?
rather than (= 0 ...)
Neither does a daisy-chained (or nested) sequence of if
expressions.
"Takes a set of test/expr pairs. It evaluates each test one at a time. If a test returns logical true, cond evaluates and returns the value of the corresponding expr and doesn't evaluate any of the other tests or exprs. (cond) returns nil."
@andy.fingerhut No idea what you're talking about because the above code works as expected
@markmarkmark That's fair. I forgot about that shortcut, but I was referring to the sprawling structure
But technically what I have is shorter
fizzbuzz2
below has the same behavior as fizzbuzz
above does
(defn fizzbuzz2 []
(doseq [n (range 1 101)]
(cond (and (= 0 (mod n 3)) (= 0 (mod n 5))) (println "FizzBuzz")
(= 0 (mod n 3)) (println "Fizz")
(= 0 (mod n 5)) (println "Buzz")
:else (println n))))
Ok. Then I guess there was a typo somewhere when I tried that
That's better then, thanks
I think that the natural typo to make when using cond at first is to wrap the condition and result in a pair of parens
that would cause some weird things to happen
Probably what happened
I also haven't written Clojure in a minute too
Part of why I wanted to do FizzBuzz
Yet I'm still baffled as to how so many people fail to do it
I’m not currently in front of a Clojure machine, but I believe that if you cheat and use cl-format
you can DRY it up quite a bit:
(defn fizzbuzz [n]
(doseq [i (range 1 (inc n))]
(cl-format true "~&")
(when (zero? (mod i 3))
(print "Fizz"))
(when (zero? (mod i 5))
(print "Buzz"))))
Interesting, but the cond
is more readable
Not repeating anything anyway
And that's wrong
Unless I'm misunderstanding cl-format
Also not sure why you made it variable length. FizzBuzz is explicitly [1 100]
If I had to guess the biggest mistake is doing [1 100)
From quick testing, this is close (but not identical) to the original fizzbuzz
:
(defn fizzbuzz3 []
(doseq [i (range 1 101)]
(clojure.pprint/cl-format
true "~&~%"
(when (zero? (mod i 3))
(print "Fizz"))
(when (zero? (mod i 5))
(print "Buzz")))))
I wish I had a real Clojure REPL in front of me (displaced Common Lisper here), but the identical logic in CL works fine
The difference is that it does not print numbers when neither Fizz nor Buzz are printed.
Then that's not FizzBuzz
;; This is CL; see above for the Clojure version
(loop for i from 1 to 100 doing
(progn
(format t "~&")
(when (zerop (mod i 3))
(format t "Fizz"))
(when (zerop (mod i 5))
(format t "Buzz"))))
Fizz
Buzz
Fizz
Fizz
Buzz
Fizz
FizzBuzz
…
It's 101!
Literally just talked about that
Tim's version is Common Lisp, not Clojure.
CL is inclusive for range endings?
But either way still wrong. It's not printing the other numbers
Line 6 (`(println n)`) in the original solution above was cut off for me and I didn’t realize I had to expand it. Anyway, it seems like the answer to the original question is “`cond` and zero?
can clean things up a bit, and avoiding repetition of the mod
logic is probably more trouble than it’s worth”
I don't think anyone is claiming it has the same behavior as your original version. I think Tim presented it as food for thought, as a potentially interesting way to reduce the number of explicit conditions written in the code.
Yes.
@andy.fingerhut And that is meaningless when the spec must include that functionality, but anyway
And zero?
might be "easier to read" for some people, but it's actually not shorter
I actually prefer the cond
version because it is more readable, despite being a bit longer
If you want a fun challenge, think about how to do fizzbuzz with no booleans (or pattern matching). I've given the challenge to a few different people and its always interesting to see what people come up with. You can assume you have a range
function and can iterate over each element of it.
That's interesting for sure
And there is an actual solution to that?
There are multiple.
I'm guessing it's something pretty subtle
does no boolean mean no way to check equality?
That's where I'm stuck
This does not attempt to solve it in the way jimmy described -- just another variation similar to Tim's that does behave the same as the original:
(defn fizzbuzz4 []
(doseq [n (range 1 101)]
(let [msg (str (if (= 0 (mod n 3)) "Fizz" "")
(if (= 0 (mod n 5)) "Buzz" ""))]
(println (if (= msg "") n msg)))))
you can remove the empty strings from the if clauses defining msg
(ins)user=> (str nil "OK")
"OK"
(ins)user=> (str nil nil)
""
(ins)user=> (str "OK" nil)
"OK"
I know. I'm just not (yet) comfortable relying on such things 🙂
and that doseq is so close to a dotimes...
you can replace (if (= msg "") n msg)
with (or (not-empty msg) n)
(ins)user=> (not-empty "")
nil
(ins)user=> (not-empty "foo")
"foo"
That's another one that is technically shorter, but different readability
as far as I'm concerned both not-empty and zero? are clearer - they are weak constructs so their meaning is more direct
I use them even when they are longer
I like using =
because it's consistent with forms that don't have those shortcuts
I prefer specialization when it exists in the standard library, it reduces ambiguity
eg always use val instead of second/last for map entries
For example, there are short forms for < and >, but not <= or >=. You have to use an additional form to negate
oh you mean pos? and neg?
So for >= 0 you have to do (not (neg? n))
When you could have just did (>= n 0)
I prefer consistency with outliers
Also the former is two operations while the latter is only one
Here's some DRY cleanup
Well it's not FizzBuzz
Hmm how do you mean, because it doesn’t print? It produces the exact sequence here: https://en.wikipedia.org/wiki/Fizz_buzz
"Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of both three and five print "FizzBuzz"."
I usually count the third param to get as kind of cheating. I usually let it slide. But ask people to rewrite without using it or or
.
Disclaimer: I don't do this in interviews. Just for fun.
Yeah same, I agree that 3-arity get is a cheat because it will use a conditional internally.
It’s a fun problem to think about abstractly, like how would you write it for using Fizz for 3, Barr for 5 and Buzz for 7. And then how would you write it when this mapping was arbitrarily given as an input.
Makes you realize what mathematical properties such a simple program really has.
Its a bit sad that the next question obviously would be: “cool, and now for 5 and 7”
That would seem unnecessary. If you can't do regular FizzBuzz you aren't going to do that and if you can you can do both
What's sad is how many people can't do it
I think Lennart's comment is that his approach can generalize for arbitrary number instead of 3 and 5, but the size of the table required gets bigger with larger number (or at least with larger values of their least common multiple)
Cool, but it's not what was asked so it would fail the test
The purpose of having an applicant do FizzBuzz is to establish that they can do basic programming, but more importantly, read a spec
If he were to give such a solution in an interview he would fail it
I don’t understand why, because it doesn’t print, is that what you are falling over?
What is the spec?
what are you implying here. The program I wrote correctly produces an infinite sequence of numbers with all multiples of 3 replaced by “Fizz” and multiples of 5 by “Buzz”. The only thing it doesn’t do, and was in the spec, is to limit to 100 and to print. That is however trivial to add:
(defn print-fizz-buzz
[]
(run! println (take 100 fizz-buzz)))
It uses the fact that FizzBuzz (or at least the replacements) repeat themselves after the least-common-multiple of 3 and 5, which happens to be 15.
Thats why it becomes “harder” to write this replacement table for 5 and 7, because their least common multiple is 35
Wow...so the spec is "Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of both three and five print "FizzBuzz"." Your code does not do this so you failed to understand the spec, thus failing the test. I don't know where the disconnect is...
As stated, the point is not can you do some trivial code; it's can you adhere to a simple spec.
During an interview, some interviewers are looking more for how well the applicant thinks, explains, understands, and communicates, and would not fail someone automatically if you pointed out to them that their function returns a sequence, but doesn't print it out. Especially if the applicant then says "Oh, yeah, to print it out, here are the changes required".
That's a poor interviewer then
The whole point of the test is to check your reading comprehension
Your opinion differs from mine on that point.
My opinion is irrelevant. The purpose of the test is well established
If you pass over applicants that miss minor point, but solve the meat of the problem, and quickly understand and fix the problem when it is pointed out, I think the interviewer is potentially missing out on a great candidate.
Yeah, and on mine. I think its more important that an applicant has the ability to abstract and adapt than to follow the test to the letter.
The question was clear. The question did not ask for an abstraction, thus you failed the test
This is pretty amazing I have to say...
Great, then you are not hiring us 🙂
the efficacy of fizzbuzz et. al. is murky anyway, but getting the correct answer is never the point of these questions but how they approach problem solving. If you read the problem wrong the first time, I am not going to fault you for it. If you respond to feedback and correct it, you still pass.
If you didn't follow the spec, which is your job as a developer, hell no
I've stated multiple times what the purpose of the question is, which is well established. It's supposed to be dead simple so you can easily follow it. If you can't follow a deliberately blatantly simple spec the chances you are going to follow a complex spec is very slim to none.
Considering that a large portion of "bugs" come from not adhering to the established spec, this is critical
Which is why it is testing that
Other questions are indeed looking for how the applicant reasons and not caring about the actual answer, but this isn't one of them
Hiring managers that pass people that fail such tests are a huge part of the problem
Lets agree to have different opinions here, some of us like to test the reasoning capability of applicants (and this is what we do at my company) and others like to test the way they read specifications.
You're again missing it. Our opinions are irrelevant. The FIzzBuzz question tests a specific thing, which has been stated repeatedly. What you think it is testing or what you think it should be testing is irrelevant.
Would you agree that companies should be able to set their own hiring policies?
Hiring managers that ask folks to program in an interview is a huge part of the problem 🙂
On-the-spot tests in interviews just don't work. They don't reflect real-world programming experience at all.
That is an over-generalization
There are certainly bad questions, FizzBuzz is not one of them
FizzBuzz reflects real-world very well. CAN YOU READ A SPEC?
I've been a hiring manager for two decades. I've never asked these sorts of "performing monkey" questions in interviews, and I've never had to fire anyone I've hired for an inability to program.
there are many hills to die on, the exact purpose of fizzbuzz is not one of them
Well that there is an Appeal to Authority fallacy so ok?
I think FizzBuzz is a stupid interview question/technique. It's as simple as that.
Good for you?
And, to be honest, this whole discussion belongs in #jobs-discuss if it belongs anywhere at all in this Slack.
I don't recall the original conversation being about whether or not it is a good idea, but what it is
It could have been moved there, but the original conversation was about Clojure so it was on-topic.
This is also a thread so if people don't want to read it they don't have to. You nitpicking about where this should be is unnecessary
Sean is a moderator on Clojurians Slack, and often helpfully points out to people where discussions most appropriately belong (or in some cases, do not)
Yes, I would like to add that your tone can be seen as hostile, or it it least felt hostile to me. Please realise that you are on a public forum full of humans who can get their feelings hurt, and are here to wind down and relax. This is obviously not a real job interview ^^.
There is no tone in text conversations, which is the issue here. I did not mean any negative "tone" and suggest that perhaps your defensiveness made you interpret what I said as such. Given the initial conversation was about adhering to the spec of FizzBuzz, stating that your proposed solution fails the spec is perfectly valid and wasn't implied as a defect with you, but just an objective statement. I'm sorry that you interpreted it that way.
@borkdude I have 2 convenience parsers for XML here using clojure.data.xml and tagsoup