Является ли Rebol функциональным языком программирования?


9

Я столкнулся с Реболом, и мне было интересно об этом.

Отсюда я столкнулся со следующим скриптом :

 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
 ]

Все операции манипуляции с коллекцией map-eachнапоминают мне JavaScript и C #, которые имеют функциональные возможности.

Является ли Rebol функциональным языком? Поддерживает ли он функциональное программирование? Будет ли это классифицироваться как чисто функциональный язык (PFL)?



1
@GregHewgill Спасибо за этот ресурс. Я задал этот вопрос после чата в чате StackOverflow Rebol ( chat.stackoverflow.com/transcript/message/7836761#7836761 ). Они (Мы) решили, что, поскольку на StackExchange нет информации об этом на программистах или других сайтах, я должен спросить ее здесь для дальнейшего использования. Эта ссылка хороша, но ее можно расширить и объяснить здесь, чтобы больше пользователей, не являющихся опытными программистами Rebol, могли ее понять. Ответ с цитатами из этой статьи и личным опытом развития будет принята с благодарностью.
Бенджамин Грюнбаум

Атрибуты едва улучшают XML-сценарий Карла: у вас все еще есть лишние метаданные (имена атрибутов) и нетипизированные значения (содержимое атрибутов). Неявные метаданные Rebol, предоставляемые тщательно определенными типами, устраняют изрядное бремя интерпретации. В XML вы должны сначала разблокировать значения, а затем расшифровать их (как определяется дата в XML - проверять ли спецификацию RSS или Atom? Можете ли вы выразить определение в XML?), А затем, возможно, проверить их, только тогда вы можете оценить их контекст. ** Предназначен в качестве комментария в ответ на [этот комментарий] ( programmers.stackexchange.com/questions/1

Ответы:


13

« Чистое функциональное программирование» в своем формальном определении относится к идее конструирования вычислительных машин, выход которых является чисто «функцией ввода в машину» . Если вы подаете один и тот же вход в аппарат, он будет выдавать тот же результат. Каждый вход назван явно, так что вы точно знаете, каковы зависимости. Чисто функциональный язык программирования обеспечивает это строго.

Тем не менее ... в базовом "Rebol" вы можете написать такие вещи, как:

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

Здесь мы видим функцию, которая возвращает свой целочисленный ввод каждый день, но сегодня, где вы получаете значение плюс один. Он включает в себя невидимую зависимость от даты, которая формально не указана в качестве аргумента функции. Именно такие вещи заставляют людей из Haskell и таких формалистов программного обеспечения, как я, кричать о кровавом убийстве.

Следовательно, Rebol не является чистым функционалом из коробки. (... но читайте дальше ...)

Менее строгое определение функционального программирования - когда функции могут выступать в качестве значений в языке. Таким образом, вы можете назначить функцию переменной и использовать ее позже. В этом смысле вы можете прочесть, что такое javascript - функциональный язык, и увидеть, что из-за сложного определения некоторые люди скажут, что Javascript - это функциональный язык. Если вы не будете использовать определение, это будет «функционально»:

>> foo: does [a + 10]

>> a: 20

>> print foo
== 30

(Примечание: DOES - это удобство для определения функции без аргументов, которая имеет только тело.)

Я не знаю, подумаю ли я (или JavaScript), чтобы люди, с которыми я общаюсь, называли функциональное программирование. YMMV.

Если вы проводите какое-то время в компьютерных науках, вы узнаете о таких вещах, как тьюринг Тьюринга и вычислимость, и о подобных принципах эквивалентности, где «если вы можете соединить X с Y, тогда Z будет правдой». И точно так же, как вы можете написать реализацию на Haskell в C, а затем ограничиться использованием только вызовов C, отображаемых в библиотеке Haskell, вы можете утверждать, что выполняете «функциональное программирование» и быть технически правильными.

Так что, если вы хотите сказать, что Rebol может быть привязан к функциональным стилям программирования, вы можете быть пессимистом и сказать: «Ну, это не лучше, чем притворяться, что вы делаете C, когда вы на самом деле используете такое ограниченное подмножество языка, которое вы» Вы используете Haskell по доверенности " . Фокус в рукаве Ребола заключается в том, как легко вы переходите от одной «диалектной» парадигмы к другой. Написание небольшого предметно-ориентированного языка, который оказывается функциональным, настолько легко и естественно, что вы не чувствуете, что для этого выкручиваете свой язык. Способность создавать специфичные для предметной области языки, имеющие функциональный характер, приводит к маркировке Rebol как «нейтральной по отношению к парадигме» .

Многие люди смешивают Rebol с его наиболее распространенным диалектом (диалект DO) и думают, что «это то, чем является Rebol». Но «сущность» Rebol больше похожа на XML, это формат обмена данными, который по совпадению (хорошо, не случайно) имеет гипероптимизированный код, ориентированный на его обработку некоторыми определенными способами из коробки. Хорошую справочную информацию о том, как он превосходит XML, см. В статье « Было ли изъяном XML с самого начала » Карл Сассенрат из AmigaOS (а теперь и Rebol).


1
Это отличный ответ, но я думаю, что статья «Был ли XML ошибочным с самого начала» довольно плохая. Во-первых, он использует плохой XML (все, что он представляет во вложении, может быть представлено с атрибутами). Во- вторых, языки будут представлены в виде дерева , как структура , которая напоминает XML. Когда вы анализируете предложение, вы получаете дерево разбора, будет несправедливо сравнивать XML, который содержит информацию о грамматике, со строкой, специфичной для домена. Спасибо за ответ :)
Бенджамин Грюнбаум

2
Я Rebol n00b, и, как вы сказали, я тоже думаю о том, что Rebol - это диалект DO. Надеюсь вырваться из этого мышления. :-)
КК.

1
@ BenjaminGruenbaum Если бы я мог редактировать сайт Карла, поверьте мне, я бы сделал. :-)
HostileFork говорит, что не доверяйте SE

@BenjaminGruenbaum Но не все языки могут свободно манипулировать этой древовидной структурой. Ребол очень шутит в этом отношении.
Изката
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.