beginners

Getting started with Clojure/ClojureScript? Welcome! Also try: https://ask.clojure.org. Check out resources at https://gist.github.com/yogthos/be323be0361c589570a6da4ccc85f58f.
2020-12-09T03:27:05.168700Z

I’m a bit surprised there isn’t a different-arity version of future-call that accepts the executor to use as a param (with the current arity one simply passing clojure.lang.Agent/soloExecutor as it uses now). Seems like it would avoid having to reimplement things

st3fan 2020-12-09T03:41:00.169100Z

Hmm unexpected … (clojure.set/subset? #{} #{:a :b}) => true

st3fan 2020-12-09T03:41:16.169600Z

Is that something from set theory? Empty set is always a subset of another set?

dpsutton 2020-12-09T03:41:45.170Z

Ever element of it is in the other set

dpsutton 2020-12-09T03:42:20.171100Z

It’s vacuously true. An easy way to think of it is to list a counter example. Name an element that is in the empty set that is not in your other set

st3fan 2020-12-09T03:43:54.171300Z

🙂

seancorfield 2020-12-09T03:45:47.172500Z

@st3fan empty sets of things often have surprising behavior at first glance. (and) ; true, (or) ; nil for example.

st3fan 2020-12-09T03:46:22.172800Z

Interesting

seancorfield 2020-12-09T03:46:35.173Z

Similarly,

user=> (some some? [])
nil
user=> (every? some? [])
true

seancorfield 2020-12-09T03:47:57.173800Z

The latter is often more surprising, given the docstring says "Returns true if (pred x) is logical true for every x in coll, else false." because no elements are logical true.

seancorfield 2020-12-09T03:48:38.174500Z

And it can be confusing that (every? nil? []) is of course also true -- so every element is nil and not-nil at the same time 🙂

seancorfield 2020-12-09T03:49:45.175500Z

But it is true because there are no elements in [] for which the predicate isn't "logical true".

Ben Sless 2020-12-09T04:48:57.175900Z

What you want doesn't exist in core clojure but others have got you covered https://github.com/TheClimateCorporation/claypoole

phronmophobic 2020-12-09T05:03:38.176200Z

regarding not having a param for passing an executor, I think it's because it's an implementation detail. I think future is only meant to fulfill a basic need. anything more complex than that and it would probably be better suited as a stand-alone library rather than a core feature.

Mark McWiggins 2020-12-09T05:08:18.177500Z

Is there a way to evaluate a symbol to use as a keyword? For example, if I have '("A" "some data")

dpsutton 2020-12-09T05:10:41.178300Z

can you give a literal example of what you want to accomplish? is some data a map with keywords and you have a string and you want to look up the value at that keyword entry?

Mark McWiggins 2020-12-09T05:13:11.179500Z

Never mind I found it: (keyword (first '("A" "some data")) gives me what I want: A:

Audrius 2020-12-09T07:18:59.180500Z

Hi, What is the idiomatic way to convert :two-word keyword to Two Word strings?

2020-12-09T08:49:48.183400Z

You can also use this library for similar conversions: https://clj-commons.org/camel-snake-kebab/.

✅ 2
dpsutton 2020-12-09T07:24:38.181100Z

str it, split on "-", map capitize, and then join it back together with a string

✔️ 1
dpsutton 2020-12-09T07:27:16.181300Z

(->> (str/split (name :two-words) #"-") (map str/capitalize) (str/join " "))

dpsutton 2020-12-09T07:28:09.182200Z

this often comes up when converting keywords into display items in a UI. You can probably create a better regex to match on underscores and some other common separators if applicable

Lyderic Dutillieux 2020-12-09T12:58:12.188800Z

Hey guys, Why does : (first {:a 1, :z 2}) return [:a 1] (val (first {:a 1, :z 2})) return 1 BUT (val [:a 1]) throw a ClassCastException instead of returning 1 as the two statements above would suggest ?

Lyderic Dutillieux 2020-12-09T13:00:28.188900Z

I guess it has to do with the underlying types (PersistentVector vs Map), But wouldn't it be more consistent to have val being equivalent to second in case of a vector with 2 elements ? Same thing for key and first

2020-12-09T13:20:28.189800Z

yes its because of the underlying types

2020-12-09T13:20:31.190100Z

user=> (type (first {:a 1}))
clojure.lang.MapEntry
user=> (type [:a 1])
clojure.lang.PersistentVector

👍 1
2020-12-09T13:22:34.191100Z

clojure has many examples where you can use a generic (second) or specific (val) function

2020-12-09T13:23:13.191900Z

the specific functions are usually more performant

2020-12-09T14:31:47.192400Z

I believe (class (first {:a 1, :z 2}) is a MepEntry class, not PersistentVector, and that key and val have special behavior for MapEntry objects that they do not have for regular vectors.

2020-12-09T14:33:55.192600Z

MapEntry objects have a default printed representation that looks like a two-element vector, and I believe operations that you can do on a vector also work on a MapEntry, e.g. nth, first, second, assoc.

2020-12-09T14:34:13.192800Z

But the converse is not true -- some operations like key and val work on MapEntry, but not on vectors.

Chinmay Dalal 2020-12-09T16:47:45.194300Z

i'm trying to get the sums of all possible pairs of numbers in a vector between i and i-25

(let [subv (subvec v (- i 25) i)
        a (transient [])]
    (for [b subv
          c subv
          :when (> c b)]
      (conj! a (+ b c)))
    (persistent! a))

Chinmay Dalal 2020-12-09T16:47:58.194600Z

where v is the input vector

Chinmay Dalal 2020-12-09T16:48:12.195Z

why does this return an empty vector?

Chinmay Dalal 2020-12-09T16:48:16.195200Z

[]

2020-12-09T16:51:05.195700Z

For is not a loop

2020-12-09T16:51:33.196400Z

That also isn't a correct usage of transients

2020-12-09T16:52:04.197100Z

That is "bashing in place"

Chinmay Dalal 2020-12-09T16:52:51.198Z

does that mean i have to use loop and handle indices manually?

2020-12-09T16:54:03.198500Z

Dunno

dpsutton 2020-12-09T16:54:56.199500Z

i think if you just use the for loop without the transient you have exactly what you want: a collection of (+ b c) when (> c b). you don't need to accumulate this into another collection if the for builds this collection in the first place

dpsutton 2020-12-09T16:55:41.200200Z

you're building a collection and then for each element in that collection putting it into another collection. just use the first collection without the unnecessary extra collection

Chinmay Dalal 2020-12-09T16:59:27.200500Z

cool, but now those sums are in vectors

Chinmay Dalal 2020-12-09T16:59:37.200800Z

turns out i dont need a vector at all

Chinmay Dalal 2020-12-09T17:00:01.201200Z

(let [subv (subvec v (- i 25) i)]
        
    (for [b subv
          c subv
          :when (> c b)]
      (+ b c)))
is enough

Chinmay Dalal 2020-12-09T17:00:34.201700Z

it returns a list which i then turn into a vector

dpsutton 2020-12-09T17:01:00.202100Z

you need random access to this collection?

Chinmay Dalal 2020-12-09T17:01:17.202300Z

wdym?

Chinmay Dalal 2020-12-09T17:01:45.203Z

https://adventofcode.com/2020/day/9

dpsutton 2020-12-09T17:01:48.203100Z

i'm wondering why you need a vector instead of the lazy sequence that is returned

Chinmay Dalal 2020-12-09T17:02:15.203400Z

uhh idk actually

Chinmay Dalal 2020-12-09T17:02:31.203800Z

i'll go forward with the list

Chinmay Dalal 2020-12-09T17:11:07.204Z

thanks !!

roelof 2020-12-09T19:36:03.204800Z

Im doing the clojure farm course and I cannot solve this problem

roelof 2020-12-09T19:36:06.205Z

(defn my_filter
  "filters a collection on a predicate"
  [collection predicate]
  (let [new_collection (seq collection)] 
     (for [element collection] 
          (if (predicate collection)
            (conj element new_collection)
            new_collection))
     new_collection)
; Syntax error compiling at (chapter4.clj:13:24).
; Unable to resolve symbol: collection in this context

roelof 2020-12-09T19:36:22.205300Z

anyone here who can make this work

2020-12-09T19:36:59.205500Z

for is not a loop

dpsutton 2020-12-09T19:37:59.206200Z

You’re also calling the predicate on the entire collection each time rather than the element

roelof 2020-12-09T19:38:56.206600Z

oke, but why is collection not known in the let part ?

roelof 2020-12-09T19:39:26.207100Z

@hiredman so I can better use recursion ? or another loop ?

2020-12-09T19:39:57.207200Z

it's kind of funny that this works

user=> (conj (first {:a 1}) :b)
[:a 1 :b]

2020-12-09T19:40:13.207400Z

I think it auto-promotes to persistent vector

2020-12-09T19:41:03.207700Z

hard to say

2020-12-09T19:41:19.208100Z

your code is missing a closing paren, so it doesn't run as is

2020-12-09T19:41:35.208500Z

but if I add a closing paren, I don't get an error

2020-12-09T19:41:47.208800Z

user=>
(defn my_filter
  "filters a collection on a predicate"
  [collection predicate]
  (let [new_collection (seq collection)]
     (for [element collection]
          (if (predicate collection)
            (conj element new_collection)
            new_collection))
     new_collection)


)
#'user/my_filter
user=>

roelof 2020-12-09T19:42:52.209900Z

hmm, I still see a error :

; Syntax error (ClassNotFoundException) compiling at (output.calva-repl:51:22).
; Thread.java:834

2020-12-09T19:43:05.210100Z

that is not the same error

roelof 2020-12-09T19:43:26.210600Z

yep, that is another one

2020-12-09T19:43:27.210700Z

what class does it say is not found?

roelof 2020-12-09T19:44:03.211200Z

nope, I see only this :

; Syntax error (ClassNotFoundException) compiling at (output.calva-repl:51:22).
; Thread.java:834
clojure.lang.Compiler/analyze (Compiler.java:6808)
clojure.lang.Compiler$InvokeExpr/parse (Compiler.java:3820)
clojure.lang.Compiler/analyzeSeq (Compiler.java:7108)
clojure.lang.Compiler/analyze (Compiler.java:6789)
clojure.lang.Compiler$BodyExpr$Parser/parse (Compiler.java:6120)
clojure.lang.Compiler$FnMethod/parse (Compiler.java:5467)
clojure.lang.Compiler$FnExpr/parse (Compiler.java:4029)
clojure.lang.Compiler/analyzeSeq (Compiler.java:7104)
clojure.lang.Compiler/analyze (Compiler.java:6789)
clojure.lang.Compiler/eval (Compiler.java:7173)
clojure.core/eval (core.clj:3214)
clojure.core/eval (core.clj:3210)
nrepl.middleware.interruptible-eval/evaluate (interruptible_eval.clj:87)
clojure.core/apply (core.clj:665)
clojure.core/with-bindings* (core.clj:1973)
nrepl.middleware.interruptible-eval/evaluate (interruptible_eval.clj:87)
clojure.main/repl (main.clj:414)
clojure.main/repl (main.clj:435)
clojure.main/repl (main.clj:345)
nrepl.middleware.interruptible-eval/evaluate (interruptible_eval.clj:84)
nrepl.middleware.interruptible-eval/evaluate (interruptible_eval.clj:56)
nrepl.middleware.interruptible-eval/interruptible-eval (interruptible_eval.clj:152)
nrepl.middleware.session/session-exec (session.clj:202)
nrepl.middleware.session/session-exec (session.clj:201)
java.lang.Thread/run (Thread.java:834)

2020-12-09T19:44:30.211600Z

it isn't part of the stacktrace, it is part of the exception

2020-12-09T19:44:35.211800Z

look at *e

roelof 2020-12-09T19:45:12.212400Z

?? sorry this is my first step in clojure. What do you mean with look at *e

2020-12-09T19:45:24.212700Z

are you at a repl?

roelof 2020-12-09T19:45:30.212900Z

yep

2020-12-09T19:45:39.213400Z

type in *e and hit enter

2020-12-09T19:46:18.214Z

it will show a data representation of the last exception that bubbled up to the top of the repl loop

roelof 2020-12-09T19:46:22.214400Z

oke

roelof 2020-12-09T19:46:32.214800Z

then I see this :

clj::chapter4=> *e

#error {
 :cause "Thread.java:834"
 :via
 [{:type clojure.lang.Compiler$CompilerException
   :message "Syntax error compiling at (/home/roelof/clojure/Learning_in_public/ground_up/.calva/output-window/output.calva-repl:51:22)."
   :data #:clojure.error{:phase :compile-syntax-check, :line 51, :column 22, :source "/home/roelof/clojure/Learning_in_public/ground_up/.calva/output-window/output.calva-repl"}
   :at [clojure.lang.Compiler analyze "Compiler.java" 6808]}
  {:type java.lang.ClassNotFoundException
   :message "Thread.java:834"
   :at [java.net.URLClassLoader findClass "URLClassLoader.java" 471]}]
 :trace
 [[java.net.URLClassLoader findClass "URLClassLoader.java" 471]
  [clojure.lang.DynamicClassLoader findClass "DynamicClassLoader.java" 69]
  [java.lang.ClassLoader loadClass "ClassLoader.java" 589]
  [clojure.lang.DynamicClassLoader loadClass "DynamicClassLoader.java" 77]
  [java.lang.ClassLoader loadClass "ClassLoader.java" 522]
  [java.lang.Class forName0 "Class.java" -2]
  [java.lang.Class forName "Class.java" 398]
  [clojure.lang.RT classForName "RT.java" 2207]
  [clojure.lang.RT classForName "RT.java" 2216]
  [clojure.lang.Compiler resolveIn "Compiler.java" 7394]
  [clojure.lang.Compiler resolve "Compiler.java" 7357]
  [clojure.lang.Compiler analyzeSymbol "Compiler.java" 7318]
  [clojure.lang.Compiler analyze "Compiler.java" 6768]
  [clojure.lang.Compiler analyze "Compiler.java" 6745]
  [clojure.lang.Compiler$InvokeExpr parse "Compiler.java" 3820]
  [clojure.lang.Compiler analyzeSeq "Compiler.java" 7108]
  [clojure.lang.Compiler analyze "Compiler.java" 6789]
  [clojure.lang.Compiler analyze "Compiler.java" 6745]
  [clojure.lang.Compiler$BodyExpr$Parser parse "Compiler.java" 6120]
  [clojure.lang.Compiler$FnMethod parse "Compiler.java" 5467]
  [clojure.lang.Compiler$FnExpr parse "Compiler.java" 4029]
  [clojure.lang.Compiler analyzeSeq "Compiler.java" 7104]
  [clojure.lang.Compiler analyze "Compiler.java" 6789]
  [clojure.lang.Compiler eval "Compiler.java" 7173]
  [clojure.lang.Compiler eval "Compiler.java" 7131]
  [clojure.core$eval invokeStatic "core.clj" 3214]
  [clojure.core$eval invoke "core.clj" 3210]
  [nrepl.middleware.interruptible_eval$evaluate$fn__964$fn__965 invoke "interruptible_eval.clj" 87]
  [clojure.lang.AFn applyToHelper "AFn.java" 152]
  [clojure.lang.AFn applyTo "AFn.java" 144]
  [clojure.core$apply invokeStatic "core.clj" 665]
  [clojure.core$with_bindings_STAR_ invokeStatic "core.clj" 1973]
  [clojure.core$with_bindings_STAR_ doInvoke "core.clj" 1973]
  [clojure.lang.RestFn invoke "RestFn.java" 425]
  [nrepl.middleware.interruptible_eval$evaluate$fn__964 invoke "interruptible_eval.clj" 87]
  [clojure.main$repl$read_eval_print__9068$fn__9071 invoke "main.clj" 414]
  [clojure.main$repl$read_eval_print__9068 invoke "main.clj" 414]
  [clojure.main$repl$fn__9077 invoke "main.clj" 435]
  [clojure.main$repl invokeStatic "main.clj" 435]
  [clojure.main$repl doInvoke "main.clj" 345]
  [clojure.lang.RestFn invoke "RestFn.java" 1523]
  [nrepl.middleware.interruptible_eval$evaluate invokeStatic "interruptible_eval.clj" 84]
  [nrepl.middleware.interruptible_eval$evaluate invoke "interruptible_eval.clj" 56]
  [nrepl.middleware.interruptible_eval$interruptible_eval$fn__995$fn__999 invoke "interruptible_eval.clj" 152]
  [clojure.lang.AFn run "AFn.java" 22]
  [nrepl.middleware.session$session_exec$main_loop__1062$fn__1066 invoke "session.clj" 202]
  [nrepl.middleware.session$session_exec$main_loop__1062 invoke "session.clj" 201]
  [clojure.lang.AFn run "AFn.java" 22]
  [java.lang.Thread run "Thread.java" 834]]}

2020-12-09T19:46:38.215Z

which depending, may or may not be the same ClassNotFoundException

2020-12-09T19:47:23.215400Z

ah

2020-12-09T19:47:59.215900Z

you have a random Thread.java:834 somewhere in the code you are trying to evaluate

2020-12-09T19:48:30.216500Z

which was part of earlier stacktrace, which is why I didn't recognize it as part of the error message

roelof 2020-12-09T19:48:56.216900Z

he, I never uses Random anywhere as far as I know

2020-12-09T19:49:04.217100Z

not Random

roelof 2020-12-09T19:49:18.217700Z

this is my code in the namespace

roelof 2020-12-09T19:49:24.218100Z

(ns chapter4)

; Write a function to find out if a string is a palindrome–that is, if it looks
;  the same forwards and backwards.
(defn palindrome? 
  "checks if a string is a palingdrome"
  [word]
  (= (seq word) (reverse word) ))

(defn my_filter
  "filters a collection on a predicate"
  [collection predicate]
  (let [new_collection (seq collection)] 
     (for [element collection] 
          (if (predicate element)
            (conj element new_collection)
            new_collection))
     new_collection))
  

2020-12-09T19:49:32.218300Z

no

2020-12-09T19:49:44.218500Z

you are trying to run something else

2020-12-09T19:49:58.218900Z

maybe without realizing it you copied and pasted too much or something

roelof 2020-12-09T19:50:06.219200Z

that can be

roelof 2020-12-09T19:50:43.220200Z

I think so, because now I see the code compiling

2020-12-09T19:50:49.220600Z

because that error says the expression Thread.java:834 literal appears in your program, and for whatever reason clojure is trying to resolve it as a class, which it isn't, which is why you get the error

roelof 2020-12-09T19:51:07.221Z

now time to fin d out how I can make the predicate part in a call

roelof 2020-12-09T19:56:57.221700Z

I give up

(my_filter [(1 2 3 4) (fn [x] (even? x))  ])
error :
; Execution error (ClassCastException) at chapter4/eval17683 (form-init1042520059576704410.clj:20).
; class java.lang.Long cannot be cast to class clojure.lang.IFn (java.lang.Long is in module java.base of loader 'bootstrap'; clojure.lang.IFn is in unnamed module of loader 'app')

dpsutton 2020-12-09T19:57:49.222500Z

(1 2 3 4) is calling 1 as a function on the arguments 2 3 4. The error message is saying that 1 a "java.lang.Long" can't be invoked (cast to clojure.lang.IFn)

roelof 2020-12-09T19:58:26.222900Z

pff, that one needs to be a collection

dpsutton 2020-12-09T19:58:50.223300Z

sure. but you're invoking it, not making a collection

dpsutton 2020-12-09T19:59:20.223800Z

(+ 1 1) means invoke +. (1 2 3 4) similarly means invoke 1

roelof 2020-12-09T20:00:03.224200Z

pff, how do I then make it a collection ?

2020-12-09T20:00:21.224500Z

use [] instead

dpsutton 2020-12-09T20:00:34.224800Z

maybe the easiest way is [1 2 3 4] making it a vector

2020-12-09T20:01:00.225100Z

that's the normal way in clojure also

2020-12-09T20:01:18.225500Z

there's also '(1 2 3 4) but that's a more limited approach

roelof 2020-12-09T20:02:54.226300Z

oke, I give up on clojure . on the code that worked I see now suddenly

; Syntax error compiling at (chapter4.clj:10:1).
; Unable to resolve symbol: defn in this context

dpsutton 2020-12-09T20:03:38.226700Z

often see this happen when you do (in-ns chapter4) before requiring it

roelof 2020-12-09T20:04:25.227200Z

I only do crtl-alt-c crlt-alt-j

roelof 2020-12-09T20:05:16.228100Z

thanks for the help butI do not like to fight the whole day against a compiler with error messages that makes no sense

2020-12-09T20:31:14.228200Z

yes, many operations that work on persistent vectors also work on MapEntry, but return an object with class clojure.lang.PersistentVector, not clojure.lang.MapEntry.

Lars Nilsson 2020-12-09T20:40:19.231400Z

For whatever it's worth, you are defining my_filter to take two arguments, collection and predicate, but you only try to pass one argument when you call it, a vector containing the collection and predicate. After fixing the syntax issue with [1 2 3 4] either use deconstruction in in my_filter, (defn my_filter [ [ collection predicate ] ] (...)) or pass the two parts separately as two different arguments.

2020-12-09T20:40:32.231800Z

@roelof in-ns is only for debugging, in code it creates broken namespaces

2020-12-09T20:40:56.232200Z

they are fixable, but the easier fix is to just not use in-ns

pez 2020-12-09T21:01:45.233600Z

@roelof You need to load the file before things start to work. (`ctrl+alt enter` if using Calva).

pez 2020-12-09T21:03:26.234800Z

I feel ya about the error messages. But otherwise I kinda like how I am in control of what is defined where, using Clojure.

2020-12-09T22:15:02.238400Z

hi 🙂 I checked https://github.com/bbatsov/clojure-style-guide but didn’t find the following … what do you think about this as a suggestion? > Only return a literal true or false from the body of an if when you actually need a literal as a result and the if’s condition doesn’t already evaluate to a literal. > > Bad — if a truthy non-literal result works in your context: > (if (some pred coll) true false)

dpsutton 2020-12-09T22:18:42.239100Z

i'm not sure i'm following. but that repo is open to issues with suggestions for new guidelines and will most likely get some feedback

seancorfield 2020-12-09T22:28:26.239600Z

@fappy Better to say (boolean (some pred coll)) instead of if

🎯 2
2020-12-09T22:42:51.242200Z

Hi I wonder what's the best candidate in Clojure to ceate a loop like in this Java snippet:

public static Socket getListeningSocket() {
    for ( int port = MIN_PORT ; port <= MAX_PORT ; port++ )
    {
        try {
            ServerSocket s = new ServerSocket( port );
            return s;      // no exception means port was available
        } catch (IOException e) {
            // try the next port
        }
    }
    return null;   // port not found, perhaps throw exception?
}
for? loop?

2020-12-09T22:44:19.242900Z

How can I break on first success (first free port assigned)?

dpsutton 2020-12-09T22:44:49.243400Z

loop requires a manual recur. recur in your catch and you'll stop on the first successful port

dpsutton 2020-12-09T22:46:49.243900Z

ah sorry, can't recur from the catch. so just catch and return a sigil and check that against the sigil

2020-12-09T22:55:52.244600Z

Thx @dpsutton What is a "sigil"?

2020-12-10T09:20:20.251300Z

Thanks @dpsutton, it's exactly what I needed! And TIL sigil too. 😉

dpsutton 2020-12-09T22:56:36.245200Z

some recognizable value that can't come from starting a server. can do (Object.) or ::bad

dpsutton 2020-12-09T22:56:43.245400Z

here's an example that just uses nil as the sigil

Scott Starkey 2020-12-09T23:00:25.246200Z

Hi community. I am trying to make a https://docs.oracle.com/javase/7/docs/api/javax/swing/filechooser/FileNameExtensionFilter.html with Java interop. This is what I’m doing:

(ns filter.core
(:import (javax.swing.filechooser FileNameExtensionFilter))
....
(def fnef (FileNameExtensionFilter. "CSV files", "csv"))
However, I’m getting the following error message:
Cannot cast java.lang.String to [Ljava.lang.String;
Can someone please tell me what I’m doing wrong? I’m a bit flummoxed! 😩

st3fan 2020-12-09T23:00:53.246800Z

Given [1 2 3 4 5] how do I generate [1 2] [2 3] [3 4] [4 5] ? - Is there a convenience function for this?

nate 2020-12-09T23:01:25.247100Z

(partition 2 1 [1 2 3 4 5])

👍 4
st3fan 2020-12-09T23:01:46.247500Z

🙂

dpsutton 2020-12-09T23:02:42.247600Z

https://clojure.org/reference/java_interop#_vararg_methods that constructor uses varargs: FileNameExtensionFilter(String description, String... extensions)

dpsutton 2020-12-09T23:03:43.247900Z

you need to make the array that is used

dpsutton 2020-12-09T23:06:10.248300Z

(javax.swing.filechooser.FileNameExtensionFilter. "CSV files" (into-array String ["csv"]))

st3fan 2020-12-09T23:06:22.248700Z

(I think I finally have all the pieces for Day 7 of Advent of Code)

seancorfield 2020-12-09T23:07:16.248800Z

Ah, I see you cross-posted this in #interop as well. We prefer folks not cross-post questions since it can waste people's time replying in one channel, not realizing someone else has already helped you in another channel.

Scott Starkey 2020-12-09T23:11:05.249Z

I’ll delete there.

1
Scott Starkey 2020-12-09T23:11:12.249200Z

Thanks for your help!

seancorfield 2020-12-09T23:15:04.249500Z

(saved you the trouble -- I deleted your Q and my responses from there @scotto)

Scott Starkey 2020-12-09T23:15:31.249700Z

Great, thanks. Sorry for the faux pas, @seancorfield

seancorfield 2020-12-09T23:15:45.249900Z

The variadic interop catches folks out all the time. No worries!