2016-04-06 42 views
1

Yazdığım her Lisp programında belirli bir işlevi yeniden uygulamak zorunda kaldım. Bu işlev çok kullanışlı olduğundan, daha önce uygulanmış olmalıdır. İyi bilinmesini beklerdim. Belki de Common Lisp'in standart kütüphanesinin bir parçası. Ne deniyor ve hangi kütüphaneden geliyor?Bir yüklemeyi karşılayan alttrees işlev toplama için standart ad?

(defun unknown-function (predicate tree) 
    (loop for item in tree 
     if (funcall predicate item) collect item 
     else if (listp item) append (unknown-function predicate item))) 

Bir ağacın içinden inen ve yüklemi tatmin o ağacın bütün düğümlerin düz listesini oluşturur.

+3

Genellikle, gerçekleştirmeye çalıştığınız görev, bir ağacı düzleştiren ve öğeyi bu listeden filtreleyen başka iki işlevi birleştirerek çözülür. Common Lisp'de düzleştirilmiş bir ilkel işlev yoktur (ancak google'da çok fazla tanım bulabilirsiniz, örneğin bkz. [Bu bağlantı] (http://stackoverflow.com/questions/2680864/how-to-remove-nested -paraheses-in-lisp)), filtre işlevi için çıkar-if-remove-if-not ([manual] (http://www.lispworks.com/documentation/HyperSpec/Body/f_rm_rm.htm) kullanabilirsiniz. #)) eğer kaldırın. – Renzo

+1

'flatten' ve' remove-if-not' işlevi bu işlevi üretemedi; çünkü yüklem, ağacın alt listelerini seçebilirken, 'flatten', yüklemenin onları görme şansı elde etmeden önce tüm alt listelerden kurtulur. –

cevap

0

Benim orijinal ifadesi çünkü içine soyundan önce Alt listeler yüklem ile test edilir burada incelik, yanlıştır. Burada, otçuluk için:

Bunun için standart bir isim bulunmamaktadır. Sadece bir liste listesini düzleştirmenin ve bir yüklemeyi karşılamayan öğeleri filtrelemenin birleşimidir. Common Lisp olarak, orada yerleşik bir düzleştirmek, ama düzleştirmek kendi bir arada ve standart remove-if-not olurdu.

Bu yaprakların ek olarak alt ağaçlar kontrol yapmak fonksiyonların subst ailesi ile ortak biraz daha vardır. Bununla birlikte, bireyleri tamamen ortadan kaldırmaktan ziyade, ağacın unsurlarını değiştiriyorlar. Yani alt- ve alt- alt öğelerinde ortak bir şey var, ancak yine de tam olarak eşleşmiyorlar.

+1

Tam olarak değil. Bilinmeyen işlevimde, yüklem, ağacın alt listelerini seçebilir, ancak genel bir "düz" işlevi, "kaldır-çıkar" öğesinin yüklemeye geçme şansı elde etmeden önce tüm alt listelerden kurtulacaktır. –

+0

Oh, bu bir * çok * güzel nokta! Bu ** alt ** ve ** alt-if-not ** ile biraz daha ortak noktası var, bence. Hala mükemmel bir maç değil ama cevabımı güncelledim. –

+0

Popüler bir kütüphanede böyle bir şey var mı? –