Ceylon
От: Аноним  
Дата: 23.11.11 08:23
Оценка:
синтаксис проще чем у немерли

1
print("Hello, " name "!"); вместо "Hello, $name !"


2. не нужна ->
Table table {
    title="Squares";
    rows=5;
    Border border {
        padding=2;
        weight=1;
    }
    Column {
        heading="x";
        width=10;
        String content(Natural row) {
            return row.string;
        }
    },
    Column {
        heading="x**2";
        width=10;
        String content(Natural row) {
            return (row**2).string;
        }
    }
}


3. можно делать пересечения и объединения интерфейсов (зачем не понял)

4. a:=1 — эквивалентно def a=1 что сокращает код

http://ceylon-lang.org/documentation/introduction/
Re: Ceylon
От: hardcase Пират http://nemerle.org
Дата: 23.11.11 09:15
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>синтаксис проще чем у немерли


А>1

А>print("Hello, " name "!"); вместо "Hello, $name !"

Очень спорно что лучще

А>2. не нужна ->


А>Table table {

А> title="Squares";
А> rows=5;
А> Border border {
А> padding=2;
А> weight=1;
А> }
А> Column {
А> heading="x";
А> width=10;
А> String content(Natural row) {
А> return row.string;
А> }
А> },
А> Column {
А> heading="x**2";
А> width=10;
А> String content(Natural row) {
А> return (row**2).string;
А> }
А> }
А>}

<- это вообще макрос, который был написан значительно позже устаканивания синтаксиса языка.

Этот подход взят из Smalltalk (о чем автор упомянул), и базируется на подходе к вызову методов:
метод {
  параметр = значение
}


Мне в принципе нравится, точно лучше чем в C#.

А>3. можно делать пересечения и объединения интерфейсов (зачем не понял)


В Nemerle это прикрутить возможно (компилятор с такими типами работать умеет), вопрос только — зачем.

А>4. a:=1 — эквивалентно def a=1 что сокращает код


О да, мегасокращение!



З.Ы. В Ceylon нету перегрузок.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Ceylon
От: _nn_ www.nemerleweb.com
Дата: 23.11.11 09:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>синтаксис проще чем у немерли


А>1

А>print("Hello, " name "!"); вместо "Hello, $name !"
А чем $".." плох ?
И как в Ceylon делать:
using System.Console;
 
def x = 1;
def lst = [1, 2, 3, 52];

// This string similar: @"lst = ..$(lst; ""; "");" but it simply read.
WriteLine($<#lst = ..$(lst; "; ");#>);

def sep = "; ";
def cnv = x => "0x" + x.ToString("X");
WriteLine($@"x = $x; lst = ..$(lst; sep; cnv);");

WriteLine($".$x;");
WriteLine($"lst = '..$lst';");

lst = 1; 2; 3; 52;
x = 1; lst = 0x1; 0x2; 0x3; 0x34;
.1;
lst = '1, 2, 3, 52';


А>2. не нужна ->


class A
{
 public this(a : int, b : int) {}
}
 
def a = A(b = 2, a = 2);



А>3. можно делать пересечения и объединения интерфейсов (зачем не понял)

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

А>4. a:=1 — эквивалентно def a=1 что сокращает код

def вполне устраивает всех.
Сделай себе макрос и пользуйся

А>http://ceylon-lang.org/documentation/introduction/
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Ceylon
От: Аноним  
Дата: 23.11.11 10:12
Оценка:
Named arguments

зачастую необходимая вещь

printf {
to = process;
format = "Thanks, %s. You have been charged %.2f.
Your confirmation number is %d.";
user.name, order.total, order.confimationNumber
};

void printf(OutputStream to, String format, Object... values) {
...
}
Re: Ceylon
От: WolfHound  
Дата: 23.11.11 10:16
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>print("Hello, " name "!"); вместо "Hello, $name !"

We originally looked into the ${} syntax, but it turns out that this can't be lexed using a regular expression.

Короче ребята не осилили.

А>2. не нужна ->

Тоже мне сокращение.

А>3. можно делать пересечения и объединения интерфейсов (зачем не понял)

Вот это интересная фишка. Сам о таком думал.

А>4. a:=1 — эквивалентно def a=1 что сокращает код

Я тут гдето уже постил макрос который это делает.
Но вот только оно нафиг не нужно.

А вообще язычек довольно интересный. Для общего развития почитать доки стоит.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Ceylon
От: _nn_ www.nemerleweb.com
Дата: 23.11.11 10:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Named arguments


А>зачастую необходимая вещь


А>printf {

А> to = process;
А> format = "Thanks, %s. You have been charged %.2f.
А> Your confirmation number is %d.";
А> user.name, order.total, order.confimationNumber
А>};

А>void printf(OutputStream to, String format, Object... values) {

А> ...
А>}

using System;
 
interface OutputStream { Write(s : string) : void }
 
class ConsoleOutputStream : OutputStream { public Write(s : string) : void { Console.WriteLine(s); } }
 
def printf(to : OutputStream, format : String, params values : array[object])
{
  to.Write( string.Format(format, values) );
}
 
printf(
 to = ConsoleOutputStream(),
 format = "Thanks, {0}. You have been charged {1}" +
"Your confirmation number is {2}",
 values = array["User" : object, 234, 567]
);


1. В Nemerle нет автоматического приведения в object, поэтому приведение типов необходимо.
Это плюс, а не минус.
Защищает от лишних ошибок.
2.
В Nemerle нельзя указывать не именованные аргументы после именованных.
Возможно это можно и починить.

Если имеем последний аргумент типа array[T] , то последние аргументы передавать туда.

P.S.
Очевидно можно <# #> заюзать, но в ideone старая версия компилятора, а он не поддерживает многострочный <# #>
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Ceylon
От: Аноним  
Дата: 23.11.11 11:16
Оценка:
Здравствуйте, _nn_, Вы писали:


А>>2. не нужна ->


__>
__>class A
__>{
__> public this(a : int, b : int) {}
__>}
 
__>def a = A(b = 2, a = 2);
__>


а например добавить 5 элементов коллекции? причем без всяких инсертов
Re[3]: Ceylon
От: _nn_ www.nemerleweb.com
Дата: 23.11.11 11:18
Оценка:
Здравствуйте, Аноним, Вы писали:


А>а например добавить 5 элементов коллекции? причем без всяких инсертов


Не понял вопроса.
Напишите как бы хотели чтобы это выглядело.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Ceylon
От: Аноним  
Дата: 23.11.11 11:29
Оценка:
Спасибо, ни где не читал, что есть именованны параметры в немерли... давно они там?
Re[4]: Ceylon
От: Аноним  
Дата: 23.11.11 11:37
Оценка:
Table table {
title="Squares";
rows=5;
Border border {
padding=2;
weight=1;
}
Column {
heading="x";
width=10;
String content(Natural row) {
return row.string;
}
},
Column {
heading="x**2";
width=10;
String content(Natural row) {
return (row**2).string;
}
}
}
Re[4]: Ceylon
От: _nn_ www.nemerleweb.com
Дата: 23.11.11 12:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо, ни где не читал, что есть именованны параметры в немерли... давно они там?


https://github.com/rsdn/nemerle/wiki/Grok-The-rest
http://nemerle.org/grokking.html#named-parms

Давно.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Ceylon
От: _nn_ www.nemerleweb.com
Дата: 23.11.11 13:02
Оценка: 51 (1)
Здравствуйте, Аноним, Вы писали:

class Border { public this(padding : int, weight : int) {} }
class Column { public this(heading : string, widhth : int, content : int -> string) {} }

class Table { public this(title : string, rows : int, border : Border, params columns : array[Column]) { } }

def table = Table(
 title="Squares",
 rows=5,
 border = Border(
    padding=2,
    weight=1
 ),
 Column(
  heading="x",
  width=10,
  x => x.ToString()
 ),
 Column(
  heading="x**2",
  width=10,
  x => (x**2).ToString()
 )
);


А чем собственно <- плох ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Ceylon
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.11.11 13:45
Оценка:
Здравствуйте, Аноним, Вы писали:

Это все похоже на Котлин. Наверно от туда драли. Отдельные интересные решения есть, но в целом нового — 0.

Хочется поговорить о без-null-ой среде. У меня этот вопрос еще по поводу Котлика возник, но раз уж тут кто-то решил обсудить один из его прототиопв, то давайте перейдем к практике.

Вот для работы с null-значениями эти товарищи предлагают применять if с вывертом:
void hello(String? name) {
    if (exists name) {
        print("Hello, " name "!");
    }
    else {
        print("Hello, world!");
    }
}

Когда я делал похожее расширение для when, уперся в следующую проблему. Предположи, что name — это локальная переменная (или поле) и если она содержит значение, то нам нужно его изменить. Ну, нужно сделать что-то вроде:
String? name;
...
if (exists name)
  name = name + "some suffix";

Но данный пример работать не будет. Дело в том, что внутри if-а тип name будет не String?, а String. Стало быть компилятор должен будет неявно ввести еще одну локальную переменную типа String и скопировать в нее значение. Но тогда присвоение так же будет происходить в эту переменную. И мы получим сообщение об ошибке компилятора или вообще неверный код.

При использовании match или инлайн-паттерн-матчинга это можно обойти задав для переменной другое имя:
mutable name : string? = ...;
...
match (name)
{
  | Some(name2) => name = name2 + "some suffix";
  | _ => ()
}


А как эту проблему предпологается решать в Котлине и Цейлоне?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Ceylon
От: Ziaw Россия  
Дата: 23.11.11 13:56
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Хочется поговорить о без-null-ой среде. У меня этот вопрос еще по поводу Котлика возник, но раз уж тут кто-то решил обсудить один из его прототиопв, то давайте перейдем к практике.


VD>Когда я делал похожее расширение для when, уперся в следующую проблему. Предположи, что name — это локальная переменная (или поле) и если она содержит значение, то нам нужно его изменить. Ну, нужно сделать что-то вроде:

VD>
VD>String? name;
VD>...
VD>if (exists name)
VD>  name = name + "some suffix";
VD>

VD>Но данный пример работать не будет. Дело в том, что внутри if-а тип name будет не String?, а String. Стало быть компилятор должен будет неявно ввести еще одну локальную переменную типа String и скопировать в нее значение. Но тогда присвоение так же будет происходить в эту переменную. И мы получим сообщение об ошибке компилятора или вообще неверный код.

Думаю, при разборе выражения, вместо name подставляется name.Value, кроме тех мест, где name используется как L-value. Там остается name.
Re[2]: Ceylon
От: Ziaw Россия  
Дата: 23.11.11 14:15
Оценка:
Здравствуйте, WolfHound, Вы писали:

А>>3. можно делать пересечения и объединения интерфейсов (зачем не понял)

WH>Вот это интересная фишка. Сам о таком думал.

С объединением, пусть спорные, но юзкейсы я придумать могу. А вот какой смысл в пересечении
Re[3]: Ceylon
От: WolfHound  
Дата: 23.11.11 14:26
Оценка: 10 (1)
Здравствуйте, Ziaw, Вы писали:

Z>С объединением, пусть спорные, но юзкейсы я придумать могу. А вот какой смысл в пересечении

Это позволяет более четко разделять контракты.
Например, посмотри на класс Stream в .NET.
Его по-хорошему нужно разделить на несколько контрактов и выкинуть всякий мусор типа CanRead.
Но такое разделение приведет к экспоненциальному росту интерфейсов в языках, которые не поддерживают пересечение типов.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Ceylon
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.11.11 14:35
Оценка:
Здравствуйте, Ziaw, Вы писали:

VD>>
VD>>String? name;
VD>>...
VD>>if (exists name)
VD>>  name = name + "some suffix";
VD>>

VD>>Но данный пример работать не будет. Дело в том, что внутри if-а тип name будет не String?, а String. Стало быть компилятор должен будет неявно ввести еще одну локальную переменную типа String и скопировать в нее значение. Но тогда присвоение так же будет происходить в эту переменную. И мы получим сообщение об ошибке компилятора или вообще неверный код.

Z>Думаю, при разборе выражения, вместо name подставляется name.Value, кроме тех мест, где name используется как L-value. Там остается name.


Все оказалось прозаичнее. Они тоже позволяют задать псевдоним:
String? name;
...
if (exists localName = name)
  name = localName + "some suffix";


У нас в when можно использовать as. В прочем, для option у нас и так все ОК:
when (name is Some(localName))
  name = localName + "some suffix";
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Ceylon
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.11.11 14:37
Оценка:
Здравствуйте, Ziaw, Вы писали:

А>>>3. можно делать пересечения и объединения интерфейсов (зачем не понял)

WH>>Вот это интересная фишка. Сам о таком думал.

Z>С объединением, пусть спорные, но юзкейсы я придумать могу. А вот какой смысл в пересечении


Если я правильно понял написанное, то объединения — аналог вариантных типов. Точнее ограниченных объединений из ML. Там именно типы перечисляются. А пересечения — это обычные классы с наследованием интерфейсов. В общем, ничего нового. Да и откуда ему взяться то?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Ceylon
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.11.11 16:45
Оценка:
Здравствуйте, Аноним, Вы писали:

Скромный вопрос. Что за традиция под анонимом темы создавать?
Здесь кусают только откровенных троллей. За ссылку на интересные вещи только спасибо скажут.

Циклон, правда, не очень интересен, так как не так давно обсуждали его потомка — Котлин, который кроме циклоновских "нововведений", так же не мало позаимствовал у Скалы (которая, на моей взгляд куда более интересный язык).

А>синтаксис проще чем у немерли


Это спорный вопрос.

А>1

А>
А>print("Hello, " name "!"); вместо "Hello, $name !"
А>


И что тут хорошего? Каменный век. От плюсов смогли избавиться. Это достижение? Зато в конце такого выражения должен идти литерал. Бот так:
print("Hello, " name); вместо "Hello, $name"

уже не напишешь.
К тому же тебе тут рядом уже написали примеры $-строк которые вообще нереально повторить на циклоне.

И вообще, от кавычек рябить в глазах будет.

А>2. не нужна ->


Вообще-то "->" — это из описания функций. Наверно имелось в виду "<-". Дык, снова разочарую. "<-" сильно мощнее. Он может инициализировать коллекции и уже имеющиеся объекты. Так что с приведенным примером ничего общего.
Ну, а то что этот суппер новый синтаксис 1 в 1 воспроизводится на Немерле тебе уже показал _nn_.

А>3. можно делать пересечения и объединения интерфейсов (зачем не понял)


Объединения — это вариантные типы. А пересечения любые другие классы. Так что ничего кроме нового синтаксиса для старых вещей они не придумали.

А>4. a:=1 — эквивалентно def a=1 что сокращает код


Это ты вообще не въехал о чем идет речь. Оператор ":=" у них применяется вместо "=" для присвоения значений изменяемым переменным. Это они начитались Вирта.

А вот синтаксис объявления переменных них у мягко говоря странный:
variable value it = names.iterator();

while (exists name = it.head)
{
  print(name);
  it := it.tail;
}


Как-то неменрловый:
mutable it = names.iterator();

while (it.head is Some(name))
{
  print(name);
  it := it.tail;
}

мне больше нравится.

А то что у конструкций воде if нужно обязательно блок применять — это вообще пипец! То есть, так нельзя:
if (a)
  b();

Обязательно нужно так:
if (a)
{
  b();
}


Вывод типов на зачаточном уровне. Макросов нет даже в зачатке.

Короче, язык может показаться интересным только на фоне убогой Явы. А после объявления Котлина ему вообще вряд ли выжить. Так и умрет не родившись.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Ceylon
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.11.11 17:14
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Ziaw, Вы писали:


Z>>С объединением, пусть спорные, но юзкейсы я придумать могу. А вот какой смысл в пересечении

WH>Это позволяет более четко разделять контракты.

Ничего это нового не дает. Тот же список интерфейсов.

WH>Например, посмотри на класс Stream в .NET.


Да ты хоть зависимые типы введи, все равно найдется добрый молодец который все раком напишет.

WH>Его по-хорошему нужно разделить на несколько контрактов и выкинуть всякий мусор типа CanRead.


Ну, и что мешало сделать это на базе интерфейсов?

WH>Но такое разделение приведет к экспоненциальному росту интерфейсов в языках, которые не поддерживают пересечение типов.


О, как?! Обоснуй.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.