Re[8]: Развитие Nemerle
От: _Claus_  
Дата: 08.11.11 18:25
Оценка:
Здравствуйте, VladD2, Вы писали:

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


_C_>>впрочем, для макроса присваивания mutablе-у должно хватить только — есть такое имя в контексте или нет.

_C_>>если кто знает, как это спросить в макросе, поделитесь

VD>Даже этого не надо. Если заведешь две mutablе-переменных, компилятор на это укажет ворнингом.

не согласен. если неизвестна — впереди mutable, известно — оставить как есть.
Re[9]: Развитие Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.11.11 18:29
Оценка:
Здравствуйте, _Claus_, Вы писали:

VD>>Даже этого не надо. Если заведешь две mutablе-переменных, компилятор на это укажет ворнингом.

_C_>не согласен. если неизвестна — впереди mutable, известно — оставить как есть.

Ничего не понял.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Развитие Nemerle
От: _Claus_  
Дата: 08.11.11 18:45
Оценка:
Здравствуйте, VladD2, Вы писали:

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


VD>>>Даже этого не надо. Если заведешь две mutablе-переменных, компилятор на это укажет ворнингом.

_C_>>не согласен. если неизвестна — впереди mutable, известно — оставить как есть.

VD>Ничего не понял.

Сори. когда компилятор натыкается на присваивание, то ассоциированный макрос должен проверить,
известно ли это имя. если известно, выражение присваивания без изменений, если нет — вставить
впереди mutable (т. е. объявить).
Re[4]: Развитие Nemerle
От: _Claus_  
Дата: 08.11.11 19:01
Оценка:
VD>Это не правильный подход. Но раз нравится — дерзай. По крайней мере немного освоишь макросы .
Этот подход имеет право на жизнь, используется во множестве языков, а потому, если Nemerle претендует на звание суперкомпилятора
должен поддерживаться как опция или в виде макроса на ура.

Мне не нравится писать лишние слова и захламлять код.
Я вообще за то, что было одно присваивание, и компилятор определял бы его как def, если я ему ничего не присваиваю в дальнейшем,
и var-mutable, если дальше присваиваю. И если дальше могут быть проблемы с параллельностью, то компилятор должен указать это,
еще лучше сам разрулить генерацией доп. кода .. Но для начала меня бы устроила и более явная логика.
Re[11]: Развитие Nemerle
От: hardcase Пират http://nemerle.org
Дата: 08.11.11 20:06
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>Сори. когда компилятор натыкается на присваивание, то ассоциированный макрос должен проверить,

_C_>известно ли это имя. если известно, выражение присваивания без изменений, если нет — вставить
_C_>впереди mutable (т. е. объявить).

Нафига это может потребоваться?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Развитие Nemerle
От: hardcase Пират http://nemerle.org
Дата: 08.11.11 20:08
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>Я вообще за то, что было одно присваивание, и компилятор определял бы его как def, если я ему ничего не присваиваю в дальнейшем,

_C_>и var-mutable, если дальше присваиваю.

С таким успехом можно вообще все переменные объявлять mutable и не изобретать ерунды.


_C_>И если дальше могут быть проблемы с параллельностью, то компилятор должен указать это,


Отсюда подробнее. Что за параллельность?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[11]: Развитие Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.11.11 20:19
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>Сори. когда компилятор натыкается на присваивание, то ассоциированный макрос должен проверить,

_C_>известно ли это имя. если известно, выражение присваивания без изменений, если нет — вставить
_C_>впереди mutable (т. е. объявить).

Вот это намеренное встраивание источника ошибок в язык. И хотя технически это возможно, лучше этого не делать.

Если mutable сильно мозолит глаза, введи отдельный оператор для инициализации переменной и используй "=" для изменения значения.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Развитие Nemerle
От: _Claus_  
Дата: 08.11.11 20:38
Оценка:
H>Отсюда подробнее. Что за параллельность?
разделяемые состояния, многопоточность
Re[5]: Развитие Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.11.11 20:39
Оценка:
Здравствуйте, _Claus_, Вы писали:


VD>>Это не правильный подход. Но раз нравится — дерзай. По крайней мере немного освоишь макросы .

_C_>Этот подход имеет право на жизнь, используется во множестве языков, а потому, если Nemerle претендует на звание суперкомпилятора должен поддерживаться как опция или в виде макроса на ура.

Позанудствую. Термин суперкомпилятор означает совсем другое.

Что касается "используется во множестве языков", то это не аргумент. Это явная ошибка дизайна и это очевидно любому кто задумается о последствиях подобного дизайна.

Сделать подобный макрос можно. Но в состав стандартной библиотеки мы его точно не включим. Так что это частная инициатива того кому все это нужно.

Тут до тебя был товарищ который с C# пришел. Он читал, что нельзя жить без объявления переменных с использованием var. Если мы будем включать в язык все подобные решения, то язык превратится в кашу.

_C_>Мне не нравится писать лишние слова и захламлять код.


Тогда ты просто тратишь время зря. Это все равно что экономить на спичках сжигая газ.
Есть куда более радикальные средства писать меньше кода. Изучи паттерн-матчинг и другие продвинутые фичи языка. Сделай макросы которые позволят тебе описать свои задачи декларативно. Это действительно сократит объем лишнего кода.

А пока что ты демонстрируешь, что твои привычки сильнее тебя. Отбрось их и сосредоточься на изучении языка. Иначе ты так и будешь пытаться сделать из Немерле Бу, а реально крутых возможностей так и не освоишь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Развитие Nemerle
От: _Claus_  
Дата: 08.11.11 20:40
Оценка:
Здравствуйте, VladD2, Вы писали:

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


_C_>>Сори. когда компилятор натыкается на присваивание, то ассоциированный макрос должен проверить,

_C_>>известно ли это имя. если известно, выражение присваивания без изменений, если нет — вставить
_C_>>впереди mutable (т. е. объявить).

VD>Вот это намеренное встраивание источника ошибок в язык. И хотя технически это возможно, лучше этого не делать.


Да мне тока убедиться, что можно, а дальше все потру. как?
Re[12]: Развитие Nemerle
От: _Claus_  
Дата: 08.11.11 20:46
Оценка: :)
H>Нафига это может потребоваться?
чтобы не писать mutable-ы и def-ы перед переменными.
что это может вычислить компилятор.
я прикинул, мне, если портировать свой проект надо дописать
где-то 17 000 мутаблодефов (50к строк). чесслово — есть дела поважнее.
Re[13]: Развитие Nemerle
От: hardcase Пират http://nemerle.org
Дата: 08.11.11 20:46
Оценка: +1
Здравствуйте, _Claus_, Вы писали:

VD>>Вот это намеренное встраивание источника ошибок в язык. И хотя технически это возможно, лучше этого не делать.


_C_>Да мне тока убедиться, что можно, а дальше все потру. как?


Для начала нужно описать, какие задачи у тебя не получилось решить используя Boo, и конечно показать как ты их решал. Разговоры о количестве ангелов на конце иглы способе объявления переменной — пустая трата места на диске.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[14]: Развитие Nemerle
От: _Claus_  
Дата: 08.11.11 20:59
Оценка: +1
H>Для начала нужно описать, какие задачи у тебя не получилось решить используя Boo, и конечно показать как ты их решал. Разговоры о количестве ангелов на конце иглы способе объявления переменной — пустая трата места на диске.

Все у меня получалось на Boо, хочу просто с минимальными усилиями переползти со своей поклажей на Nemerle, как более стабильный и функциональный.

H>Разговоры о количестве ангелов на конце иглы способе объявления переменной — пустая трата места на диске.

не вполне. вот возьмем CoffeeScript — чудный язык, и книжки по нему, и в фаворе у многих, а среды нет.
а сделай возможным его компиляцию на Nemerle (как c#), и все будут рады, и захотят узнать, а там и углубить..

и так для любого языка. У Nemerle — мощь быть языковой платформой. и вы (правильные немерловцы) не должны пинать других, даже если их потребности
кажутся вам глупыми и смешными, а дать инструмент, чтобы мы, случайно забредшие, сначала получили что хотим, а потом, просветленные, пришли к
пониманию "правильного". Тогда всем будет благодать.
Re[6]: Развитие Nemerle
От: _Claus_  
Дата: 08.11.11 21:10
Оценка:
VD>Тут до тебя был товарищ который с C# пришел. Он читал, что нельзя жить без объявления переменных с использованием var. Если мы будем включать в язык все подобные решения, то язык превратится в кашу.

да не нужно включать такое в поставку, ессно, разве что где-то раздел сделать "странных" дополнений, куда кроме этой фичи будут входит любые средства ковертации-компиляции из
других языков. но ведь если собрать из таких наборов какой-то суперязык, который, в конечном итоге будет перемалываться Nemerle-ом, с возможностью показать итоговый код,
разве не для этого Nemerle2? идеал недостижим , но к нему нужно стремиться.

_C_>>Мне не нравится писать лишние слова и захламлять код.


VD>Тогда ты просто тратишь время зря. Это все равно что экономить на спичках сжигая газ.

VD>Есть куда более радикальные средства писать меньше кода. Изучи паттерн-матчинг и другие продвинутые фичи языка. Сделай макросы которые позволят тебе описать свои задачи декларативно. Это действительно сократит объем лишнего кода.

буду конечно учить.

VD>А пока что ты демонстрируешь, что твои привычки сильнее тебя. Отбрось их и сосредоточься на изучении языка. Иначе ты так и будешь пытаться сделать из Немерле Бу, а реально крутых возможностей так и не освоишь.


Собственно уместно повторить слова из соседней ветки http://www.rsdn.ru/forum/nemerle/4488957.1.aspx
Автор: _Claus_
Дата: 09.11.11
Re[7]: Развитие Nemerle
От: catbert  
Дата: 08.11.11 21:21
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>впрочем, для макроса присваивания mutablе-у должно хватить только — есть такое имя в контексте или нет.

_C_>если кто знает, как это спросить в макросе, поделитесь

Сначала нужно получить объект typer:
    def typer = Nemerle.Macros.ImplicitCTX();


Из него можно узнать про все задекларированные локальные переменные:
    def locals = typer.LocalContext.GetLocals();


Ну, или как-то так.
Re[13]: Развитие Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.11.11 22:15
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>Да мне тока убедиться, что можно, а дальше все потру. как?


Это будет не так просто. Нужно получить ссылку на тайпер и через него искать объявленные в текущем контексте переменные.
Набросал макрос реализующий общую идею:
using Nemerle;
using Nemerle.Collections;
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;
using Nemerle.Compiler.Typedtree;
using Nemerle.Text;
using Nemerle.Utility;

using System;
using System.Collections.Generic;
using System.Linq;

[assembly: Nemerle.Internal.OperatorAttribute ("PythonLike", ":=", false, 141, 140)]

namespace PythonLike
{
  macro @:=(expr1 : PExpr, expr2 : PExpr)
  {
    PythonAssignImpl.DoTransform(Macros.ImplicitCTX(), expr1, expr2)
  }
  
  module PythonAssignImpl
  {
    public DoTransform(typer : Typer, expr1 : PExpr, expr2 : PExpr) : PExpr
    {
      match (expr1)
      {
        | <[ $(n : name) ]> => 
          // Пытаемся найти поля в текущем объекте с именем n.
          def members = typer.CurrentTypeBuilder.LookupMember(n.Id, false);
          
          // пытаемся найти локальную переменную с именем n
          match (typer.LocalContext.FindLocal(n))
          {
            | Some(var) when var.IsMutable => <[ $expr1 = $expr2 ]> 
            | Some(var)                    => 
              // Здесь можно было бы объявлять новую неизменяемую переменную, но это вообще пипец какие грабли! 
              Message.Error(expr1.Location, $"In this context already defined immutable variable '$n'.");
              Message.Hint(var.Location, "Previous declaration.");
              <[ () ]>
            
            | None when members.IsEmpty    => <[ mutable $expr1 = $expr2 ]>
            | None                         => <[ $expr1 = $expr2 ]>
          }
        
        | _ => Message.FatalError(expr1.Location, "Expected simple name.");
      }
    }
  }
}


Вот его использование:
using System.Console;
using PythonLike;

module Program
{
  //mutable x : int = 1;
  
  Main() : void
  {
    //def x = 1;
    x := 23;
    WriteLine(x);
    x := 42;
    WriteLine(x);
    _ = ReadLine();
  }
}

Выводит:
23
42

Реальный макрос должен быть по сложнее, так как нужно учитывать, что при объявлении переменных вместо простого имени может идти паттерн (например, кортеж). Но общую идею он показывает.

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

В питоне (и Бу) просо нет понятия неизменяемой переменной. Потому и проблемы этой нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Развитие Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.11.11 22:20
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>и так для любого языка. У Nemerle — мощь быть языковой платформой. и вы (правильные немерловцы) не должны пинать других, даже если их потребности кажутся вам глупыми и смешными, а дать инструмент, чтобы мы, случайно забредшие, сначала получили что хотим, а потом, просветленные, пришли к пониманию "правильного". Тогда всем будет благодать.


Мы и не пинаем. Но несогласие свое мы выразить то можем? Вот мы и выражаем .

Мы сказали, что не согласны с тобой, и что по нашему мнению, ты занялся не тем. Но, конечно же, только тебе решать что и как делать. Подсказывать как делать мы не отказываемся. В конце концов, чем в более извращенном виде можно будет использовать немерл, тем он будет стабильнее .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Развитие Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.11.11 22:23
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>Сори. когда компилятор натыкается на присваивание, то ассоциированный макрос должен проверить,

_C_>известно ли это имя. если известно, выражение присваивания без изменений, если нет — вставить
_C_>впереди mutable (т. е. объявить).

Тут возможны варианты. В том же контексте может быть объявлена неизменяемая переменная (или переменная в паттерне). Так же в текущем объекте может быть поле с этим именем. Ну, и наконец может быть глобальный объект с тем же именем доступный через открытое пространство имен или тип. Все это надо учитывть в твоей логике.

Скажем, я вообще не представляю как быть с локальными неизменяемыми переменными.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Развитие Nemerle
От: _Claus_  
Дата: 08.11.11 22:32
Оценка:
VD>Мы сказали, что не согласны с тобой, и что по нашему мнению, ты занялся не тем. Но, конечно же, только тебе решать что и как делать. Подсказывать как делать мы не отказываемся. В конце концов, чем в более извращенном виде можно будет использовать немерл, тем он будет стабильнее .
аллах акбар!
Re[14]: Развитие Nemerle
От: _Claus_  
Дата: 08.11.11 22:35
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>В питоне (и Бу) просо нет понятия неизменяемой переменной. Потому и проблемы этой нет.
Спасибо, буду курить..
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.