Чтобы добавлять сообщения и комментарии, .

@Mazdaywik:
Mazdaywik

Простой Рефал написан на себе, компилирует в C++98, компоненты рантайма написаны тоже на C++98. Средства языка ограничены стандартной библиотекой, что определяет его переносимость.

Компилятор успешно работает на Windows (x86 и amd64), Linux (x86 и amd64), QNX (x86) и OS X (хз разрядность, студенты делали). Компилируется компиляторами Borland C Compiler 5.5, MS Visual C++, GCC (MinGW и нативные под Linux и QNX), Clang (Windows и OS X), Open Watcom (Windows).

Под DOS не переносился, потому что тупо не влезет в память (при компиляции самого себя требует 30 Мбайт под x86, 60 Мбайт под amd64) (хотя была бы интересная задача реализовать его под DOS).

В общем, Жуйк. У кого есть возможность запустить компилятор C++ под ARM (телефон, планшет, Raspberry Pi) или под какими-нибудь экзотическими платформами (Itanium, Эльбрус) и некоторое количество свободного времени, попробуйте собрать на нём Простой Рефал. Ссылка: github.com

P.S. Под Колибри и Полуосью компилировать не пробовал, возможно, когда-нибудь, руки до них дойдут.

@Mazdaywik:
Mazdaywik

Маздайщик вернулся в Жуйк со своим Рефалом. А именно:
github.com

@4DA:
4DA

Больше ада!

Куда спрятались Lisp, Refal и Prolog? Теперь всюду бестолковые Хаскелли и Агды.

Если вы посещали 0chan.hk то читали что я работаю над Symta — объединением Lisp и Refal в один язык с упором на практичность и лаконичность. Даже реализовал на нём клон Warcraft 2:

ru-declarative.livejournal.com

@Mazdaywik:
Mazdaywik

Вчера в голову пришла хорошая характеристика языка программирования Рефал: это язык, для которого интересно разрабатывать компиляторы. В нём, как в хорошем романе, есть конфликт: в силу особенностей семантики (выражения можно читать с обоих концов и конкатенировать), эффективными можно сделать только некоторые операции, другие операции будут иметь сложность O(n).

@omnivore:
omnivore

создал jabber конференцию marginal@conference.jabber.ru. Для вопросов по "редким" темам: J, lisp, refal, prolog и fusion rock :) Присоединяйтесь!

@omnivore:
omnivore

Продолжаем играться с прологом и рефалом. На этот раз добавим к нашей реализации рефаловского сопоставления по образцу жадные(greedy) переменные.

Напомню, что в языке Рефал есть такая интересная возможность, как паттерн-матчинг с так сказать "опережающим" поиском. (про Рефал писали, например, в недавнем номере ПФП). Т.о., предикат списка-палиндрома в рефале можно описать так:

Pal {
s.1 e.2 s.1 = <Pal e.2> ;
s.1 = True ;
= True;
e.1 = False ;
}

где e. переменные могут принимать любое значение подсписка (пустой, из одного или более элементов), а s. — один элемент списка.

Мы пытаемся построить с помощью пролога такой DSL, который позволил бы использовать рефаловское сопоставление по образцу (попутно добавив несколько других интересных плюшек :).

Пример предиката для определения, является ли список палиндромом, на нашем DSL приводился в одном из предыдущих постов. Сейчас же приведем несколько примеров работы с жадными переменными:

==
?- re([e(A), e(B)], [1,2,3]).
A = [],
B = [1, 2, 3].

?- re([e*(A), e(B)], [1,2,3]).
A = [1, 2, 3],
B = [].
==

Как видите, во втором примере "жадная" переменная A захватила максимально допустимое паттерном число элементов. Еще пример:

==
?- re([e(A), s(B), e(C)], [1,2,3]).
A = [],
B = s(1),
C = [2, 3].

?- re([e*(A), s(B), e(C)], [1,2,3]).
A = [1, 2],
B = 3,
C = [].
==

Добавим еще один тип переменных — непустые e-переменные. Назовем их "e+" переменные. Пример использования:
==
?- re([e+(A), e(B)], [1,2,3]).
A = [1],
B = [2, 3].

?- re([e*(A), e+(B)], [1,2,3]).
A = [1, 2],
B = [3].
==

И, в заключении, самый интересный, на мой взгляд, пример. Не забываем, что под капотом у нас пролог:
==
?- re([A,B], [1,2,3]).
A = s(1),
B = e([2, 3]).
==

В этом примере мы не указали тип переменных A и B, и пролог подставляет возможные значения типов переменных сам! Подставляет так, чтобы удовлетворить ограничению в две переменные. (замечу, что предлагается только 1 вариант, т.к. в реализации нашего DSL каждое правило оканчивается отсечением).

Вот такой вот получился наколеночный рефал :)

p.s. исходный код этой поделки на pastebin.com

@omnivore:
omnivore

скачал 5й рефал, скомпилял и сравнил скорость вычисления палиндрома :) Рефал считает на порядок быстрее (в 10 с небольшим раз быстрее), чем моя прологовская реализация "рефаловского" сопоставления по образцу из предыдущего поста. Не так и плохо, я доволен :) Все-таки там ядро на си и идет компиляция в байткод.

@omnivore:
omnivore

попытаемся реализовать "рефаловское" сопоставление по образцу с помощью пролога. В рефале есть интересная возможность паттерн-матчинга с т.с. "опережающим" поиском. (про язык Рефал писали в недавнем номере ПФП).

Т.е. например предикат списка-палиндрома в рефале можно описать примерно так (синтаксис некоего условного рефал-языка взят по памяти):

pal( ).
pal(s.X).
pal(s.X e.Y s.X) :- pal(e.Y).

где e. переменные могут принимать любое значение подсписка (пустой, из одного или более элементов), а s. — один элемент списка. Такая интересная возможность, как мне кажется, могла бы быть востребована, например, во всякого рода трансляторах.

Но кроме как в рефале в явном виде такого механизма, как будто, и нет. Попытаемся реализовать такое поведение на прологе:

pref([], [X|Xs], [X|Xs]).
pref([X|Prefix], [X|List], Rest) :- pref(Prefix, List, Rest).

re([X | Pat], [X|Xs]) :- re(Pat, Xs), !.
re([e(X) | Pat], Xs) :- pref(X, Xs, Rest), re(Pat, Rest), !.
re([e(X)], X) :- !.
re([], []) :- !.

И теперь предикат списка-палиндрома на прологе можно записать так:

pal([]) :- !.
pal([X]) :- !.
pal(A) :- re([X, e(Y), X], A), pal(Y).

получился почти рефал :)

@omnivore:
omnivore

а вот хочется мне рефаловского паттерн-матчинга в прологе. посоветуйте какой инструмент лучше использовать? в идеале бы расширение синтаксиса для какого-нибудь swi-prolog'а

@Mazdaywik:
Mazdaywik

Кусочек кода компилятора Рефала 2 на Си (в своё время переписан с PL/I). В файле порядка 800 строк в этом духе.
pastebin.org
Для тех, кому лень смотреть по ссылке --- там метки и goto.
FFFFFFFFFFFFFFUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!111111

@OCTAGRAM:
OCTAGRAM

metacomputation-ru.blogspot.com

@jtootf:
jtootf

ulm.uni.udm.ru — "Самостоятельное изучение Рефала-5. Взгляд студента"

@Mazdaywik:
Mazdaywik

*программирование *матан
Я тут недавно задумался, что в функциональных языках, синтаксис которых использует предложения вида образец = результат (Рефал, Хаскель, Эрланг), фазу сопоставления аргументов с образцом можно назвать анализом в исходном смысле этого греческого слова (ἀνάλυσις «разложение, расчленение»), т.к. аргументы разбиваются на составные части, а фазу вычисления результата --- синтезом (σύνθεσις — совмещение, помещение вместе) --- получение нового значения из уже имеющихся переменных, констант и результатов выполнения входящих в результатную часть функций. В других языках, не использующих pattern matching, фазы анализа и синтеза не разделены столь явно.