Clojure'da neden iç içe stenografi işlevleri yazamıyoruz?


11

Bugün iç içe steno işlevleri olan bir Clojure ifadesini değerlendirmeye çalıştım ve bu bana izin vermedi.

İfade şu şekildeydi:

(#(+ % (#(+ % (* % %)) %)) 5) ; sorry for the eye bleed

Çıktı şuydu:

IllegalStateException Nested #()s are not allowed  clojure.lang.LispReader$FnReader.invoke (LispReader.java:630)
...and a bunch of other garbage

2
Böyle bir kod yazmak mümkün değil clojure için iyi bir şey olduğunu bulmak.
Simon Bergot

3
Çünkü gözlerini kanıyor.
Michael Shaw

İhtiyacınız yok (# (+% 1 (# (+% 2 (*% 3% 4))% 5)) 5)?
innova

Yanıtlar:


5

% 'Nin iç fonksiyona ait olduğunu bilirsiniz. Dezavantajı dış işlev% erişimini kaybetmek olmasıdır.

Kullanım fn [x]yerine sözdizimi.


1
Yani? Çoğu zaman %dış fn'nin erişimine ihtiyacım yok ve yaptığınız zaman geri dönebilirsiniz (fn), değil mi?
Zaz

10

Tamamen keyfi; ayrıştırıcıda açıkça devre dışı bırakan birkaç satır var. Bu satırı düzenlerseniz, anonim işlevleri iç içe yerleştirmiş olabilirsiniz ve tam olarak beklediğiniz gibi davranırlar.

özellikle, https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java adresindeki 634-635 satırları

public static class FnReader extends AFn{
    public Object invoke(Object reader, Object lparen) {
        PushbackReader r = (PushbackReader) reader;
        if(ARG_ENV.deref() != null) // <-- line 634
            throw new IllegalStateException("Nested #()s are not allowed");
        // ...

Ayrıştırıcıdaki satırı belirleyebilir ve anon iç içe geçmiş bir işleve sahip olmamak için yeniden yazılan kodun ve ayrıştırıcıdan kaldırılan ve anon iç içe bir işlevin kaldırıldığı kodun aynı şekilde çalıştığını gösterebilir misiniz?

2
@MichaelT: İşte böyle. ve sadece test edebilirsiniz; Bunları çalışma zamanında kapatabileceğiniz için yapmak kolaydır. clojure ayrıştırıcısı gerçekten kolayca hacklenebilir
amara

4
Tamamen keyfi değil ; Rick Hickey sadece keyfi bir gün geçirmediyse, onu oraya koymasının bir nedeni olmalı ve bu nedenin ne olduğunu bilmiyor gibisin. Duh.
Robert Harvey

Vay be, ne bulmak! Güzel - +1.

Bu değişiklik, iç içe yöntemlerin belirsiz ayrışmasına neden olur mu? fn [x]OP kodunun yeniden yazılmış bir değiştirilmiş clojure sürümü ile aynı işlevselliğe sahip olacağını merak ediyorum. Ayrıca, clojure kodunun taşınabilirliği ile ilgili herhangi bir sorun olur mu?

3

(Fn [params] (body)) türünün anonim işlevlerini iç içe yerleştirmiş olabilirsiniz. Yalnızca # sözdizimi yuvalamayı desteklemez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.