у Nemerle есть будущее, как по вашему?
Вряд ли. Кому нужен некошерный язык, который работает только на коммерческой windows-only платформе? (некошерный - значит, не от микрософта). Захочет МС его загнобить - загнобит. К тому же C# становится все более функциональным, из существенного в нет нет только гигиенических макросов.
если параллельно с компилятором разрабатывается интеграция со студией, то зачем прогать на сишарпе, если можно так же в студии прогать на языке с большими возможностями? тем более что можно пользовать все нетовские библиотеки...
Если хочется удобств иде, писать придется только на мэйнстриме, которым ему никогда не стать. А так думаю у F# больше шансов выжить.
Компилятор и интеграция со студией активно развиваются, просто на главную страницу эти новости не попадают. Собираются в скором времени сделать большой релиз и того, и другого.
Но поскольку сделан не MS, получить нужную известность и завоевать должный mindshare вряд ли получится..
просто на главную страницу эти новости не попадаюта куда попадают? где бы про это почитать?
ближе к С/Pascalужос, хаскил рулид
Nemerle мощнее F#Что там есть хорошего окромя макросов?
они ведь расширяют синтаксис в произвольном направлении.
плюс на них можно написать такие серьезные штуки как, например, функция printf с произвольным количеством параметров...
Плюс, на сколько я понял, макросы позволяют реализовать решение аналогичное DLinq для cтак же проверя корректность запросов и типов еще на стадии компиляции...
В дебри сайта (это вики как я слышал.
O Nemerle, его успехах, преимуществах и планах релизов постоянно говорят на rsdn. Сам я в нем не копенгаген.
При поверхностном знакомстве с ними особой мощи я не заметил.
Правда, все тот же недостаток — макросы ухудшают свойство локальности кода: для того, чтобы понять, что делает код без макросов обычно достаточно знать язык и стандартную библиотеку. Если же в нем применяются макросы, надо знать, что делает каждый макрос. Причем, в каждой новой программе разбираться с макросами надо отдельно при отсутствии часто даже нормальных комментариев. Т.е. читаемость кода падает, а значит, все не очень круто.
Что там есть хорошего окромя макросов?
что скажешь по поводу вариантов и сопоставлений? вот, например, простенькое двоичное дерево, с добавление эллемента. выглядит, помоему просто и понятно.
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)
}
}
Ужасный сишный синтаксис всё портит, Хаскелевый код для функциональной парадигмы смотрится куда как лучше, имхо
Исключительно дело вкуса и привычки. С непривычки любой код на Хаскеле, окамле или F# выглядит чудовищным.
С непривычки любой код на Хаскеле, окамле или F# выглядит чудовищным.Гы. Квиксорт из туториала в две строчки уж никак не может так выглядеть.
сцылочку дай, хоть погляжу на этих зверей...
quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = (filter (< x) xs) ++ [x] ++ (filter (>= x) xs)
жездь
quicksort (x:xs) = [y | y<-xs, y<x] ++ [x] ++ [y | y<-xs, y>=x]
Ну, правда...
filter :: (a -> Bool) -> [a] -> [a]
filter p xs = [y | y <- xs, p(y)]
С непривычки любой код на ... окамле ... чудовищным.без функторов и объектов код очень даже легко и интуитивно понятно читается =)
filter хуже читается
что скажешь по поводу вариантов и сопоставлений?Вроде это в любом уважающем себя фя есть.
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")}
filter хуже читаетсяПравда?
А если, скажем, расшифровать list comprehension, развернув на n монадных строк?
А если, скажем, расшифровать list comprehension, развернув на n монадных строк?не надо, но выражение с конструированием списка выглядит куда изящнее фильтра, имхо.
quicksort (x:xs) = [y | y<-xs, y<x] ++ [x] ++ [y | y<-xs, y>=x]
А отсортировать списки справа и слева забыли?
quicksort :: Ord a => [a] -> [a], ну конечно же!
quicksort [] = []
quicksort (x:xs) = (quicksort (filter (< x) xs ++ [x] ++ (quicksort (filter (>= x) xs
Спасибо.
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!
Хаскель лучше
Слава роботам!
Пока не знаю ни того, ни другого
это ф#, или что?
quicksort :: Ord a => [a] -> [a]кста, я тут подумал - никто не мешает на Nemerle в те же три строчки уложиться
quicksort [] = []
quicksort (x:xs) = (quicksort (filter (< x) xs ++ [x] ++ (quicksort (filter (>= x) xs
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
}
let rec quicksort = function [] -> [] | x::xs -> quicksort (filter <)x) xs) @ [x] @ quicksort (filter >=) x) xs)
некрасиво, на ф# получше, но тоже некрасиво. На Haskell/Clean выглядит явно симпатичное
quicksort :: Ord a => [a] -> [a]
public QuickSort(ar : list[int]) : list[int]
{
|[] => [] |_ => QuickSort(ar.Filter(x => ar.Head < x + (ar.Head :: QuickSort(ar.Filter(x => ar.Head > x
}
так покрасивей?после длительной работы с ocaml могу сказать, что написание каждого "|"-выбора с новой строки делает код гораздо более читабельным =)
ну эт я так... типа в одну строку)
Операторы сравнения можно применять к чему угодно.
Нет, уродские |, {{{{}}}} всё портят. Ещё синтаксис C нафиг для функциональных языков не нужный, имхо.
кста, я тут подумал - никто не мешает на Nemerle в те же три строчки уложиться
quicksort :: Ord a => [a] -> [a]
quicksort s = if length s < 2 then s else (quicksort (filter (< x) xs ++ [x] ++ (quicksort (filter (>= x) xs
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]}
Ага - глупо меряться строчками, если в большинстве языков переводы строки не имеют никакого значения, и можно тупо склеить всё в одну строчку.
в большинстве языков переводы строки не имеют никакого значенияВ хаскеле имеют (если забивать на ; и {}).
под большинством он имел ввиду php видимо =)
если забиватьНу, если забивать, то и в JS имеют.
А если не забивать - то можно ли в этом хаскеле склеить любую программу в одну очень длинную строку?
f :: Float a => a -> a
f x | x < 0.0 = -1.0
| x > 0.0 = 1.0
| otherwise = 0.0
Сравни с:
И, действительно, в большинстве языков переводы строк/пробелы для компилятора не имеют абсолютно никакого значения, и нужны только для удобства чтения кода человеком.
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
вот вы любители языками трепать
public f( a : double) : int
{
| a when a > 0 => 1
| a when a < 0 => -1
| _ => 0
}
а что тут такого?
А ты все-таки сравни с картинкой...
Раз пошло такое веселье, вот вариант на Руби:
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
Я ведь тоже пробелы могу убрать оттуда, где они не нужны...
Давай. Интересно найти самую короткую реализацию..
HQ9S+. Реализация - 1 символ.
Ассемблер машины Волкова. Реализация - одна машинная инструкция.
Ошибка если будут равные элементы.
а так?
q(a:list[int]):list[int]{|h::r=>q($[x|x in r,x<h])+(h::q($[x|x in r,x>=h]|_=>[]}
HQ9S+. Реализация - 1 символ.QSORTRAN. Реализация - пустой файл (qsort выполняется автоматически).
HAFFBACK: минус 1 бит — если в программе выполняется qsort, размер программы меньше на 1 бит!
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.
code:
q(a:list[int]):list[int]{|h::r=>q($[x|x in r,x<h])+(h::q($[x|x in r,x>=h]|_=>[]}
буээээ, все эти $$$$ - перловая отрыжка
Звоните прямо сейчас!
Ты победил
def qs(a)a==[]? a:(h=a[0];b=a[1..-1];c=b.select{|i|i<h};qs(c)+[h]+qs(b-cend
Оставить комментарий
Alexander08
глянул - вроде прикольный язык! функциональное программирование, деревья, макросы, и т.п. и т.д.вот только когда компилятор доделают - неизвестно и это настораживает...