|
|
|
|
|
by shagie
1094 days ago
|
|
While I had a class in '94 using LISP, it wasn't until dabbling with using "compute pi using pi/4 = 1/1 - 1/3 + 1/5 - 1/7 ..." as a replacement for FizzBuzz. In 2013 (and I can point to the date) I was also playing with Clojure and wrote: (defn pi
([] (float (* 4 (pi 1 0.01 0 true))))
([term tol accum pn]
(let
[t (/ 1 term)
a ((if pn + -) accum t)]
(if (< (* 4 t) tol)
a
(pi (+ term 2) tol a (not pn))
)
)
)
)
While I won't claim that that is beautiful Clojure, the `((if pn + -) accum t)` part was a lightbulb moment for me about how LISP and functional programming really worked.With Java 8 (and beyond) I've become comfortable with passing around functions themselves or creating a Map<String, Function> or having an enum with a function field. if (type == enum.FOO) {
UnaryOperator<String> trim = s -> s.replaceFirst("^0+", "");
idFun = trim.compose(DTO::getFooNum);
} else {
idFun = DTO::getBarNum;
}
// ...
Set<String> ids = results.stream().map(idFun).collect(Collectors.toSet());
As to LISP-ish concepts with {} syntax... https://en.wikipedia.org/wiki/Schwartzian_transform @sorted = map { $_->[0] }
sort { $a->[1] <=> $b->[1]}
map { [$_, -s $_] } # get the size of the file on disk
@files;
|
|