Saya mencoba untuk mengevaluasi ekspresi Clojure dengan fungsi tulisan cepat bersarang hari ini, dan itu tidak membiarkan saya.
Ungkapannya adalah:
(#(+ % (#(+ % (* % %)) %)) 5) ; sorry for the eye bleed
Outputnya adalah:
IllegalStateException Nested #()s are not allowed clojure.lang.LispReader$FnReader.invoke (LispReader.java:630)
...and a bunch of other garbage
functional-programming
syntax
clojure
functions
Lincoln Bergeson
sumber
sumber
Jawaban:
Anda akan tahu bahwa% milik fungsi dalam. Kekurangannya adalah Anda akan kehilangan akses ke% di fungsi luar.
Gunakan
fn [x]
sintaks sebagai gantinya.sumber
%
fn luar, dan pada saat Anda melakukannya, Anda bisa mundur(fn)
, kan?Ini sepenuhnya arbitrer; ada beberapa baris di parser yang secara eksplisit menonaktifkannya. Jika Anda mengedit garis itu, Anda dapat memiliki fungsi anonim bersarang, dan mereka bertindak persis seperti yang Anda harapkan.
secara khusus, baris 634-635 di https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java
sumber
fn [x]
penulisan ulang kode OP akan memiliki fungsi yang identik dengan versi clojure yang dimodifikasi. Selain itu, apakah akan ada masalah dengan portabilitas kode clojure?Anda dapat memiliki fungsi anonim bersarang dari jenis (fn [params] (body)). Hanya sintaks # yang tidak mendukung penyatuan.
sumber