у Nemerle есть будущее, как по вашему?

Alexander08

глянул - вроде прикольный язык! функциональное программирование, деревья, макросы, и т.п. и т.д.
вот только когда компилятор доделают - неизвестно и это настораживает...

Papazyan

Вряд ли. Кому нужен некошерный язык, который работает только на коммерческой windows-only платформе? (некошерный - значит, не от микрософта). Захочет МС его загнобить - загнобит. К тому же C# становится все более функциональным, из существенного в нет нет только гигиенических макросов.

Alexander08

а почему не нужен?
если параллельно с компилятором разрабатывается интеграция со студией, то зачем прогать на сишарпе, если можно так же в студии прогать на языке с большими возможностями? тем более что можно пользовать все нетовские библиотеки...

timefim

>если можно так же в студии прогать на языке с большими возможностями?
Если хочется удобств иде, писать придется только на мэйнстриме, которым ему никогда не стать. А так думаю у F# больше шансов выжить.

karkar

Nemerle мощнее F#, а по синтаксису привычней большинству программеров, ближе к С/Pascal.
Компилятор и интеграция со студией активно развиваются, просто на главную страницу эти новости не попадают. Собираются в скором времени сделать большой релиз и того, и другого.
Но поскольку сделан не MS, получить нужную известность и завоевать должный mindshare вряд ли получится..

Alexander08

просто на главную страницу эти новости не попадают
а куда попадают? где бы про это почитать?

Olenenok

ближе к С/Pascal
ужос, хаскил рулид

timefim

Nemerle мощнее F#
Что там есть хорошего окромя макросов?

Alexander08

ну а просто макросов тебе не достаточно?
они ведь расширяют синтаксис в произвольном направлении.
плюс на них можно написать такие серьезные штуки как, например, функция printf с произвольным количеством параметров...
Плюс, на сколько я понял, макросы позволяют реализовать решение аналогичное DLinq для cтак же проверя корректность запросов и типов еще на стадии компиляции...

karkar

>а куда попадают? где бы про это почитать?
В дебри сайта (это вики как я слышал.
O Nemerle, его успехах, преимуществах и планах релизов постоянно говорят на rsdn. Сам я в нем не копенгаген.

timefim

При поверхностном знакомстве с ними особой мощи я не заметил.

Helga87

Не, макросы в Немерле - это совершенно волшебная вещь. Они избавлены хотя бы от одного недостатка - они не текстовые, что позволяет забыть о том, что на всякий случай надо было раньше везде ставить скобки.
Правда, все тот же недостаток — макросы ухудшают свойство локальности кода: для того, чтобы понять, что делает код без макросов обычно достаточно знать язык и стандартную библиотеку. Если же в нем применяются макросы, надо знать, что делает каждый макрос. Причем, в каждой новой программе разбираться с макросами надо отдельно при отсутствии часто даже нормальных комментариев. Т.е. читаемость кода падает, а значит, все не очень круто.

Alexander08

 
Что там есть хорошего окромя макросов?

что скажешь по поводу вариантов и сопоставлений? вот, например, простенькое двоичное дерево, с добавление эллемента. выглядит, помоему просто и понятно.
 
partial public variant BTree ['T] where 'T : IComparable['T]
{
| Node
{
left : BTree ['T];
elem : 'T;
right : BTree ['T];
}
| Tip
static Insert (t : BTree ['T], e : 'T) : BTree ['T]
{
match (t)
{
| BTree.Node (l, cur, r) =>
if (e.CompareTo(cur) < 0)
BTree.Node (Insert (l, e cur, r)
else if (e.CompareTo(cur) > 0)
BTree.Node (l, cur, Insert (r, e
else
t
| BTree.Tip => BTree.Node (BTree.Tip e, BTree.Tip
}
}
}

ну и еще добавление новых операций радует...
 
 
partial public variant BTree ['T] where 'T : IComparable['T]
{
public static @<+> (t : BTree ['T], e : 'T) : BTree ['T]
{
Insert(t, e)
}
public static @<+> (e : 'T, t : BTree ['T]) : BTree ['T]
{
Insert(t, e)
}
}

Olenenok

Ужасный сишный синтаксис всё портит, Хаскелевый код для функциональной парадигмы смотрится куда как лучше, имхо

karkar

Исключительно дело вкуса и привычки. С непривычки любой код на Хаскеле, окамле или F# выглядит чудовищным. :)

apl13

С непривычки любой код на Хаскеле, окамле или F# выглядит чудовищным.
Гы. Квиксорт из туториала в две строчки уж никак не может так выглядеть. :p

Alexander08

сцылочку дай, хоть погляжу на этих зверей...

apl13

В общем, не помню я, где этот туториал, квиксорт в нем выглядел примерно так:
quicksort        :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = (filter (< x) xs) ++ [x] ++ (filter (>= x) xs)

Alexander08

жездь

Olenenok

Некошерно, кошерно последнюю строчку писать так:
quicksort (x:xs) = [y | y<-xs, y<x] ++ [x] ++ [y | y<-xs, y>=x]  

apl13

Кошерно, да.
Ну, правда...
filter      :: (a -> Bool) -> [a] -> [a]
filter p xs = [y | y <- xs, p(y)]

myrka68

С непривычки любой код на ... окамле ... чудовищным.
без функторов и объектов код очень даже легко и интуитивно понятно читается =)

Olenenok

filter хуже читается

timefim

что скажешь по поводу вариантов и сопоставлений?
Вроде это в любом уважающем себя фя есть.
type 'a Tree =
|Node of
{left:'a Tree;
elem:'a;
right:'a Tree;}
|Tip
with
static member Insert t e =
match t with
|Node (l, cur, r) ->
if e < cur then
Tree.Insert l e
else if e > cur then
Tree.Insert r e
else
t
|Tip -> Node (Tip, e, Tip)

partialов нет, зато есть анонимные классы
type ITest = interface
abstract Test: unit -> unit
end

let test =
{new ITest
with
Test = Console.WriteLine("test")}

apl13

filter хуже читается
Правда?
А если, скажем, расшифровать list comprehension, развернув на n монадных строк?

Olenenok

А если, скажем, расшифровать list comprehension, развернув на n монадных строк?
не надо, но выражение с конструированием списка выглядит куда изящнее фильтра, имхо.

karkar

quicksort (x:xs) = [y | y<-xs, y<x] ++ [x] ++ [y | y<-xs, y>=x]

А отсортировать списки справа и слева забыли? :)

apl13

Бля, я долбоеб!
quicksort        :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = (quicksort (filter (< x) xs ++ [x] ++ (quicksort (filter (>= x) xs
, ну конечно же!
Спасибо. :(

Olenenok

:D

agaaaa

9 часов назад, RSS Microsoft Research:
Microsoft plans to integrate F#, a functional programming language developed by the Microsoft Research group, into its Visual Studio application development platform, said S. "Soma" Somasegar, corporate vice president of the Microsoft Developer Division, in his blog.
Слава Microsoft!

salora

Хаскель лучше

apl13

Слава роботам!

agaaaa

Пока не знаю ни того, ни другого :(

Alexander08

это ф#, или что?

Alexander08

quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = (quicksort (filter (< x) xs ++ [x] ++ (quicksort (filter (>= x) xs
кста, я тут подумал - никто не мешает на Nemerle в те же три строчки уложиться
 
public QuickSort(ar : list[int]) : list[int]
{
if(ar.Length > 1) QuickSort(ar.Filter(x => ar.Nth(ar.Length/2) < x + (ar.Nth(ar.Length/2) :: QuickSort(ar.Filter(x => ar.Nth(ar.Length/2) > x
else ar
}

timefim

Он самый.

let rec quicksort = function [] -> [] | x::xs -> quicksort (filter <)x) xs) @ [x] @ quicksort (filter >=) x) xs)

salora

некрасиво, на ф# получше, но тоже некрасиво. На Haskell/Clean выглядит явно симпатичное

myrka68

а как быть с упорядоченностью элементов? =)
quicksort :: Ord a => [a] -> [a]

Alexander08

так покрасивей?
 
public QuickSort(ar : list[int]) : list[int]
{
|[] => [] |_ => QuickSort(ar.Filter(x => ar.Head < x + (ar.Head :: QuickSort(ar.Filter(x => ar.Head > x
}

myrka68

так покрасивей?
после длительной работы с ocaml могу сказать, что написание каждого "|"-выбора с новой строки делает код гораздо более читабельным =)

Alexander08

ну эт я так... типа в одну строку)

timefim

>а как быть с упорядоченностью элементов? =)
Операторы сравнения можно применять к чему угодно.

salora

Нет, уродские |, {{{{}}}} всё портят. Ещё синтаксис C нафиг для функциональных языков не нужный, имхо.

apl13

кста, я тут подумал - никто не мешает на Nemerle в те же три строчки уложиться
quicksort :: Ord a => [a] -> [a]
quicksort s = if length s < 2 then s else (quicksort (filter (< x) xs ++ [x] ++ (quicksort (filter (>= x) xs

:cool:

Alexander08

это ты типа в две уложился? ну тогда держи

qs(ar:list[int]):list[int]{|list.Nil|[]=>[]|_=>qs($[x|x in ar,x<ar.Head])+(ar.Head::qs($[x|x in ar,x>ar.Head]}

kruzer25

Ага - глупо меряться строчками, если в большинстве языков переводы строки не имеют никакого значения, и можно тупо склеить всё в одну строчку.

apl13

в большинстве языков переводы строки не имеют никакого значения
В хаскеле имеют (если забивать на ; и {}).

myrka68

под большинством он имел ввиду php видимо =)

kruzer25

если забивать
Ну, если забивать, то и в JS имеют.
А если не забивать - то можно ли в этом хаскеле склеить любую программу в одну очень длинную строку?

salora

А вот так немерль может?:
f :: Float a => a -> a
f x | x < 0.0 = -1.0
| x > 0.0 = 1.0
| otherwise = 0.0

Сравни с:
[math]  $$f(x)=\begin{cases}  -1, x < 0\\  1, x > 0\\  0\text{ иначе}  \end{cases}$$  [/math]

kruzer25

Под большинством я имел в виду все, о которых слышал (Java, Javascript, C, C++, C#, Pascal, PHP, Perl итп кроме питона, в котором, вроде как, даже пробелы могут иметь значение.
И, действительно, в большинстве языков переводы строк/пробелы для компилятора не имеют абсолютно никакого значения, и нужны только для удобства чтения кода человеком.

apl13

qsort = (\xs -> if null xs then xs else let (x:ys) = xs in qsort [y | y <- ys, y < x] ++ [x] ++ qsort [y | y <- ys, y >= x])

Или, если с фильтрами, а не лист-компрехенсией:
qsort = (\xs -> if null xs then xs else let (x:ys) = xs in (qsort $ filter (< x) ys) ++ [x] ++ (qsort $ filter (>= x) ys

slonishka

вот вы любители языками трепать

Alexander08

так?
 
public f( a : double) : int
{
| a when a > 0 => 1
| a when a < 0 => -1
| _ => 0
}

а что тут такого?

apl13

А ты все-таки сравни с картинкой...

karkar

Ошибка если будут равные элементы.
Раз пошло такое веселье, вот вариант на Руби:
def qs(a) a.empty? ? a:qs(a[1..-1].select{|i|i<a[0]})+[a[0]]+qs(a[1..-1].select{|i|i>=a[0]})end

apl13

Я ведь тоже пробелы могу убрать оттуда, где они не нужны... :grob:

karkar

Давай. Интересно найти самую короткую реализацию..

kruzer25

HQ9S+. Реализация - 1 символ.

Helga87

Ассемблер машины Волкова. Реализация - одна машинная инструкция.

Alexander08

Ошибка если будут равные элементы.

а так?
 
q(a:list[int]):list[int]{|h::r=>q($[x|x in r,x<h])+(h::q($[x|x in r,x>=h]|_=>[]}

apl13

HQ9S+. Реализация - 1 символ.
QSORTRAN. Реализация - пустой файл (qsort выполняется автоматически).

Helga87

HAFFBACK: минус 1 бит — если в программе выполняется qsort, размер программы меньше на 1 бит!

apl13

qs=(\s->if null s then s else let x:t=s inqs$filter(<x)t)++[x]++(qs$filter(>=x)t

qs=(\s->if null s then s else let x:t=s in qs[y|y<-t,y<x]++[x]++qs[y|y<-t,y>=x])

qs=(\s->if null s then s else let{x:t=s;a=filter(<x)t}in(qs a++[x]++qs(t\\a

В третьем варианте, правда, нужно, чтоб была импортнута библиотека List.

salora

code: 
q(a:list[int]):list[int]{|h::r=>q($[x|x in r,x<h])+(h::q($[x|x in r,x>=h]|_=>[]}

буээээ, все эти $$$$ - перловая отрыжка

apl13

Звоните прямо сейчас!

kruzer25

Ты победил :crazy:

karkar

Такой вариант на Руби на 1 символ короче варианта на Хаскеле с подключенным List'ом:
def qs(a)a==[]? a:(h=a[0];b=a[1..-1];c=b.select{|i|i<h};qs(c)+[h]+qs(b-cend 

Оставить комментарий
Имя или ник:
Комментарий: