Rebol işlevsel bir programlama dili midir?


9

Rebol'a rastladım ve merak ediyordum.

Buradan şu betiğe rastladım :

 use [feed questions answers][
    feed: load-xml/dom http://stackoverflow.com/feeds/tag/rebol
    questions: map-each entry feed/get-by-tag <entry> [
        find/match entry/get <id> "http://stackoverflow.com/q/"
    ]

    answers: make block! length? questions

    foreach question questions [
        question: load-xml/dom join http://stackoverflow.com/feeds/question/ question
        foreach entry next question/get-by-tag <entry> [append answers entry/tree]
    ]

    insert clear feed/find-element <entry> answers
    feed/flatten
 ]

Her map-eachikisi de işlevsel yeteneklere sahip olan JavaScript ve C # 'ı hatırlatmak gibi tüm koleksiyon manipülasyon işlemleri .

Rebol işlevsel bir dil midir? Fonksiyonel programlamayı destekliyor mu? Saf işlevsel bir dil (PFL) olarak sınıflandırır mı?


5
İşte REBOL'un yaratıcısından bir cevap: REBOL Saf İşlevsel Bir Dil mi?
Greg Hewgill

1
@GregHewgill Bu kaynak için teşekkür ederim. StackOverflow Rebol sohbet odasında ( chat.stackoverflow.com/transcript/message/7836761#7836761 ) bir sohbetten sonra bu soruyu sordum . Onlar (Biz) bu konuda programcılar veya StackExchange diğer siteler hakkında hiçbir bilgi olmadığı için ben burada ileride başvurmak için sormak gerektiğini düşündüm. Bu bağlantı harika ama burada genişletilebilir ve açıklanabilir, böylece Rebol programcıları olmayan daha fazla kullanıcı bunu anlayabilir. Bu makaleden alıntılar ve kişisel gelişim tecrübesi ile bir cevap takdir edilecektir.
Benjamin Gruenbaum

Öznitelikler Carl'ın XML senaryosunu zar zor iyileştirir: hala fazla meta veriye (öznitelik adları) ve türlenmemiş değerlere (öznitelik içeriği) sahipsiniz. Rebol'un dikkatle tanımlanmış türler tarafından sağlanan örtük meta verileri, yorum üzerinde adil bir yükü ortadan kaldırır. XML ile, önce değerlerin kilidini açmanız, ardından deşifre etmeniz gerekir (XML'de tanımlanmış bir tarih nasıl — RSS veya Atom spesifikasyonunu kontrol edeyim mi? XML'de tanımı ifade edebilir misiniz?) bağlamlarını değerlendirebilir. ** [Bu yoruma] yanıt olarak yorum olarak tasarlanmıştır ( programmers.stackexchange.com/questions/1

Yanıtlar:


13

Biçimsel tanımında " Saf Fonksiyonel Programlama" çıktısı tamamen "makineye girişin bir fonksiyonu" olan hesaplama makinelerini tasarlama fikri ile ilgilidir . Aynı girişi makineye beslerseniz, aynı çıkışı üretir. Her giriş açıkça adlandırılır, böylece bağımlılıkların tam olarak ne olduğunu bilirsiniz. Saf işlevsel bir programlama dili bunu titizlikle uygular.

Yine de ... başlangıçta "Rebol" gibi şeyler yazabilirsiniz:

foo: function [value [integer!]] [
    either now/date = 20-Feb-2013 [
        value + 1
    ] [
        value
    ]
]

Burada her gün ancak bugün artı değer elde ettiğiniz tamsayı girdisini döndüren bir işlev görüyoruz. İşlev için bir argüman olarak resmen belirtilmeyen tarihe görünmez bir bağımlılık içerir. Bu, Haskell insanlarını ve benim gibi yazılım formalistlerini kanlı cinayet çığlıkları haline getiren bir şey.

Bu nedenle Rebol, kutunun dışında saf bir işlev değildir . (... ama okumaya devam edin ...)

İşlevsel programlamanın daha az katı tanımı, işlevlerin dilde değerler olarak hareket edebilmesidir. Böylece bir değişkene bir işlev atayabilir ve daha sonra kullanabilirsiniz. Bu anlamda, javascript işlevsel bir dil beğenilerini okumak gidebilir ve dicey tanımının bazı insanların Javascript'in işlevsel bir dil olduğunu söylemeye yol açacağını görebilirsiniz. Tanım ile bu kadar gevşek olacaksanız, o zaman bu "işlevsel" olacaktır:

>> foo: does [a + 10]

>> a: 20

>> print foo
== 30

(Not: DOES, yalnızca gövdesi olan bağımsız değişkenleri olmayan bir işlevi tanımlamak için kolaylıktır.)

Konuştuğum insanlara uyacak şekilde (veya JavaScript'i) işlevsel programlama olarak adlandıracağımı bilmiyorum. YMMV.

Bilgisayar bilimlerinde herhangi bir zaman geçirirseniz Turing Tarpits ve hesaplanabilirlik gibi şeyleri ve "X'e Y'yi bağlarsanız Z doğru olur" gibi eşdeğerlik ilkelerini öğrenirsiniz. Ve tıpkı C'de bir Haskell uygulaması yazabildiğiniz ve daha sonra kendinizi sadece Haskell kütüphanesine eşlenen C çağrılarını kullanarak sınırlayabildiğiniz gibi, "işlevsel programlama" yaptığınızı ve teknik olarak doğru olduğunuzu iddia edebilirsiniz.

Dolayısıyla, Rebol'un işlevsel programlama stillerine bükülebileceğini söylemek istiyorsanız, kötümser olabilirsiniz ve "aslında, dilin bu kadar sınırlı bir alt kümesini kullandığınızda C yaptığınızı iddia etmekten daha iyi değil '' msgstr "Haskell'i proxy ile kullanıyorum" . Rebol'un kovanı, bir "çevirici" paradigmadan diğerine ne kadar kolay kaydığınızdır. Biraz alana özgü dil Yazma olur fonksiyonel olması kadar kolay ve doğal bunu yapmak için ortak dışarı Dil çeviriyorsun gibi hissetmez olmasıdır. Fonksiyonel karaktere sahip alana özgü diller yapabilme, Rebol'un "paradigma nötr" olarak etiketlenmesine yol açar .

Birçok kişi Rebol'u en yaygın lehçesi (DO lehçesi) ile karıştırır ve "Rebol'un ne olduğunu" düşünür. Ancak Rebol'un "özü" daha çok XML gibidir, tesadüfen (tamam, tesadüfen değil) , kutunun dışında bazı yollarla işlemeye odaklanan hiper optimize edilmiş bir koda sahip bir veri değişim formatıdır . Pantolonunu XML'den nasıl dövdüğüne dair iyi bir arka plan okuması için bkz. XML, AmigaOS (ve şimdi Rebol) şöhretinin Carl Sassenrath tarafından Start'tan kusurlu muydu .


1
Bu harika bir cevap ama "XML başlangıçtan itibaren kusurlu muydu" makalesinin oldukça kötü olduğunu düşünüyorum. Birincisi, zayıf XML kullanıyor (yuvalama ile temsil ettiği her şey niteliklerle temsil edilebilir). İkincisi, diller xml'ye benzeyen ağaç benzeri bir yapı ile temsil edilir. Bir cümleyi ayrıştırdığınızda bir ayrıştırma ağacı elde ederseniz, dilbilgisi bilgilerini içeren XML'yi etki alanına özgü dize ile karşılaştırmak adil değildir. Cevabınız için teşekkürler :)
Benjamin Gruenbaum

2
Ben bir Rebol n00b'yim ve dediğin gibi ben de Rebol'un DO lehçesinin ne olduğunu düşünüyorum. Bu zihniyetten çıkmayı umuyoruz. :-)
KK.

1
@BenjaminGruenbaum Carl'ın web sitesini düzenleyebilseydim, inan bana, isterdim. :-)
HostileFork SE

@BenjaminGruenbaum Ancak tüm diller bu ağaç yapısını serbestçe manipüle edemez. Rebol bu konuda çok lisp-y.
Izkata
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.