у Nemerle есть будущее, как по вашему?
Вряд ли. Кому нужен некошерный язык, который работает только на коммерческой windows-only платформе? (некошерный - значит, не от микрософта). Захочет МС его загнобить - загнобит. К тому же C# становится все более функциональным, из существенного в нет нет только гигиенических макросов.
а почему не нужен?
если параллельно с компилятором разрабатывается интеграция со студией, то зачем прогать на сишарпе, если можно так же в студии прогать на языке с большими возможностями? тем более что можно пользовать все нетовские библиотеки...
если параллельно с компилятором разрабатывается интеграция со студией, то зачем прогать на сишарпе, если можно так же в студии прогать на языке с большими возможностями? тем более что можно пользовать все нетовские библиотеки...
>если можно так же в студии прогать на языке с большими возможностями?
Если хочется удобств иде, писать придется только на мэйнстриме, которым ему никогда не стать. А так думаю у F# больше шансов выжить.
Если хочется удобств иде, писать придется только на мэйнстриме, которым ему никогда не стать. А так думаю у F# больше шансов выжить.
Nemerle мощнее F#, а по синтаксису привычней большинству программеров, ближе к С/Pascal.
Компилятор и интеграция со студией активно развиваются, просто на главную страницу эти новости не попадают. Собираются в скором времени сделать большой релиз и того, и другого.
Но поскольку сделан не MS, получить нужную известность и завоевать должный mindshare вряд ли получится..
Компилятор и интеграция со студией активно развиваются, просто на главную страницу эти новости не попадают. Собираются в скором времени сделать большой релиз и того, и другого.
Но поскольку сделан не MS, получить нужную известность и завоевать должный mindshare вряд ли получится..
просто на главную страницу эти новости не попадаюта куда попадают? где бы про это почитать?
ближе к С/Pascalужос, хаскил рулид
Nemerle мощнее F#Что там есть хорошего окромя макросов?
ну а просто макросов тебе не достаточно?
они ведь расширяют синтаксис в произвольном направлении.
плюс на них можно написать такие серьезные штуки как, например, функция printf с произвольным количеством параметров...
Плюс, на сколько я понял, макросы позволяют реализовать решение аналогичное DLinq для cтак же проверя корректность запросов и типов еще на стадии компиляции...
они ведь расширяют синтаксис в произвольном направлении.
плюс на них можно написать такие серьезные штуки как, например, функция printf с произвольным количеством параметров...
Плюс, на сколько я понял, макросы позволяют реализовать решение аналогичное DLinq для cтак же проверя корректность запросов и типов еще на стадии компиляции...
>а куда попадают? где бы про это почитать?
В дебри сайта (это вики как я слышал.
O Nemerle, его успехах, преимуществах и планах релизов постоянно говорят на rsdn. Сам я в нем не копенгаген.
В дебри сайта (это вики как я слышал.
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
Спасибо.


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!
Хаскель лучше
Слава роботам!
Пока не знаю ни того, ни другого 

это ф#, или что?
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 имеют.
А если не забивать - то можно ли в этом хаскеле склеить любую программу в одну очень длинную строку?
А вот так немерль может?:
Сравни с:
![[math] $$f(x)=\begin{cases} -1, x < 0\\ 1, x > 0\\ 0\text{ иначе} \end{cases}$$ [/math]](mathimg.php?math=%0D%0A%24%24f%28x%29%3D%5Cbegin%7Bcases%7D%0D%0A-1%2C%20x%20%26lt%3B%200%5C%5C%0D%0A1%2C%20x%20%26gt%3B%200%5C%5C%0D%0A0%5Ctext%7B%20%E8%ED%E0%F7%E5%7D%0D%0A%5Cend%7Bcases%7D%24%24%0D%0A)
f :: Float a => a -> a
f x | x < 0.0 = -1.0
| x > 0.0 = 1.0
| otherwise = 0.0
Сравни с:
Под большинством я имел в виду все, о которых слышал (Java, Javascript, C, C++, C#, Pascal, PHP, Perl итп кроме питона, в котором, вроде как, даже пробелы могут иметь значение.
И, действительно, в большинстве языков переводы строк/пробелы для компилятора не имеют абсолютно никакого значения, и нужны только для удобства чтения кода человеком.
И, действительно, в большинстве языков переводы строк/пробелы для компилятора не имеют абсолютно никакого значения, и нужны только для удобства чтения кода человеком.
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]|_=>[]}
буээээ, все эти $$$$ - перловая отрыжка
Звоните прямо сейчас!
Ты победил 

Такой вариант на Руби на 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 
Оставить комментарий
Alexander08
глянул - вроде прикольный язык! функциональное программирование, деревья, макросы, и т.п. и т.д.вот только когда компилятор доделают - неизвестно и это настораживает...