Макрос var как аналог для mutable
От: zz-sergant Россия https://bitbucket.org/zzsergant/hgsccpackage/wiki/Home
Дата: 22.05.11 13:20
Оценка:
Решил написать для себя макрос var, который был бы псевдонимом для mutable.

Наивный макрос:

    public macro @var(expr)
    syntax ("var", expr)
    {
        <[ mutable $expr ]>
    }


При применении:

    var i = 100;


получаю ошибку:
D:\Work\Nemerle\VarTest\VarTest\Main.n(16,3):Error: incorrect mutable variables definition: mutable i = 100 = DEFAULT

Вопрос, куда копать ?

PS: Я так понимаю наиболее близкое направление это посмотреть исходники макроса defcomp, но там довольно много написано и так сразу тяжело осознать.
-- team zz
Re: Макрос var как аналог для mutable
От: _nn_ www.nemerleweb.com
Дата: 22.05.11 13:26
Оценка: 6 (1)
Здравствуйте, zz-sergant, Вы писали:

Пробегало:
http://rsdn.ru/forum/nemerle/4160724.1.aspx
Автор: febus
Дата: 16.02.11


P.S.
Чем не нравится mutable ?
Если его много и от него корежит, может стоит улучшить код ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Макрос var как аналог для mutable
От: zz-sergant Россия https://bitbucket.org/zzsergant/hgsccpackage/wiki/Home
Дата: 22.05.11 14:30
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Пробегало:

__>http://rsdn.ru/forum/nemerle/4160724.1.aspx
Автор: febus
Дата: 16.02.11


Спасибо, это оно

__>P.S.

__>Чем не нравится mutable ?
__>Если его много и от него корежит, может стоит улучшить код ?

mutable выглядит инородно.
Если кто-то захочет осознано сделать проект на immutable переменных, то он это сделает независимо от того, какой модификатор используется для изменяемых переменных: var или mutable. А спотыкаться каждый раз при чтении не хочется.

Ради интереса посчитал сколько раз используется mutable в исходниках Nemerle в *.n файлах, включая сниппеты и другие подпроекты:
Файлов *.n: — 2337
mutable: — 5062

Не так уж и мало.
-- team zz
Re[3]: Макрос var как аналог для mutable
От: _nn_ www.nemerleweb.com
Дата: 22.05.11 14:36
Оценка: +1
Здравствуйте, zz-sergant, Вы писали:

ZS>mutable выглядит инородно.

Это как раз повод использовать меньше изменяемых переменных

ZS>Ради интереса посчитал сколько раз используется mutable в исходниках Nemerle в *.n файлах, включая сниппеты и другие подпроекты:

ZS>Файлов *.n: — 2337
ZS>mutable: — 5062

ZS>Не так уж и мало.

Количество mutable в проекте компилятора велико не потому что это хорошо
Если посмотреть на свежий код, то mutable используется гораздо реже чем в старом коде.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Макрос var как аналог для mutable
От: hardcase Пират http://nemerle.org
Дата: 22.05.11 14:48
Оценка:
Здравствуйте, zz-sergant, Вы писали:

ZS>Не так уж и мало.


А теперь посмотри где и при каких обстоятельствах используется mutable в Nemerle.Peg.
Этот проект достаточно полно описывает сценарии появления изменяемых переменных: mutable появляется как аккумулятор в циклах foreach либо как некая автогенерированная переменная.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Макрос var как аналог для mutable
От: Jack128  
Дата: 22.05.11 14:52
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, zz-sergant, Вы писали:


__>Пробегало:

__>http://rsdn.ru/forum/nemerle/4160724.1.aspx
Автор: febus
Дата: 16.02.11

а чем в данном конкретном коде проблема??
Re[3]: Макрос var как аналог для mutable
От: Ziaw Россия  
Дата: 22.05.11 15:18
Оценка: 8 (3)
Здравствуйте, Jack128, Вы писали:

J>а чем в данном конкретном коде проблема??


В коде zz-sergant?

Дело в том, что макросы работают на уровне AST, а не на уровне строк. А квазицитаты это такой сахар для конструктора AST (это важно для понимания как составления квазицитат, так и матчинга).

Соответственно квазицитата <[ mutable $expr ]> где expr : PExpr, превращается в вызов конструктора PExpr.DefMutable, конструктор берет два параметра, но в данному случае парсер видит только один, поэтому вторым параметром он ставит DEFAULT, который будет преобразован в значение по умолчанию.
Re: Макрос var как аналог для mutable
От: catbert  
Дата: 22.05.11 15:46
Оценка:
Здравствуйте, zz-sergant, Вы писали:

ZS>Решил написать для себя макрос var, который был бы псевдонимом для mutable.


ZS>Наивный макрос:


ZS>
ZS>    public macro @var(expr)
ZS>    syntax ("var", expr)
ZS>    {
ZS>        <[ mutable $expr ]>
ZS>    }

ZS>


Это мой первый макрос у вас в expr передается <[x = 100]>. Соответственно код выходит <[mutable (x = 100);]>. А (x = 100) — некорректное имя переменной.

Поэтому вам придется деконструировать expr, как уже было написано.
Re[3]: Макрос var как аналог для mutable
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.05.11 10:21
Оценка:
Здравствуйте, zz-sergant, Вы писали:

ZS>Ради интереса посчитал сколько раз используется mutable в исходниках Nemerle в *.n файлах, включая сниппеты и другие подпроекты:

ZS>Файлов *.n: — 2337
ZS>mutable: — 5062

А теперь сравним это с появлением def — 30374.
Кроме того mutable используется и для полей. По умолчанию поля доступны только для чтения. Ну, и как верно заметил _nn_, то что mutable встречается в компиляторе часто не делает чести компилятору. Его код писался разными людьми которые в то время имели разный опыт. Если бы mutable было бы меньше, то качество проекта от этого было бы только выше.

Так что mutable неплохая лакмусовая бумажка выявляющая недостатки в коде. Это конечно не железное правило, но хорошая эвристика.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Макрос var как аналог для mutable
От: BogdanMart Украина  
Дата: 28.05.11 20:44
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Так что mutable неплохая лакмусовая бумажка выявляющая недостатки в коде. Это конечно не железное правило, но хорошая эвристика.


Его, наверно, специально сделали из 7 букв, чтобы людям было лень его использовать и писали def.
Re[5]: Макрос var как аналог для mutable
От: hardcase Пират http://nemerle.org
Дата: 28.05.11 20:52
Оценка: +1
Здравствуйте, BogdanMart, Вы писали:

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


VD>>Так что mutable неплохая лакмусовая бумажка выявляющая недостатки в коде. Это конечно не железное правило, но хорошая эвристика.


BM>Его, наверно, специально сделали из 7 букв, чтобы людям было лень его использовать и писали def.


А мне нравится mutable его видно при объявлении. def/var по длине равны и потому заметить мутабельную переменную сложнее:
def xttt  = ...
def yzz   = ...
def zzzz  = ...
var fsdfd = ...
def dsawe = ...



А вот тут она сразу заметна:
def xttt  = ...
def yzz   = ...
def zzzz  = ...
mutable fsdfd = ...
def dsawe = ...
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Макрос var как аналог для mutable
От: zz-sergant Россия https://bitbucket.org/zzsergant/hgsccpackage/wiki/Home
Дата: 29.05.11 07:29
Оценка:
Здравствуйте, VladD2, Вы писали:

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


ZS>>Ради интереса посчитал сколько раз используется mutable в исходниках Nemerle в *.n файлах, включая сниппеты и другие подпроекты:

ZS>>Файлов *.n: — 2337
ZS>>mutable: — 5062

VD>А теперь сравним это с появлением def — 30374.


def используются не только для переменных, но и для локальных функций.
Поэтому сравнивать просто количество def не совсем корректно.
Но даже если принять, что количество def правильное, то соотношение 1 к 6 все равно большое.

VD>Кроме того mutable используется и для полей. По умолчанию поля доступны только для чтения. Ну, и как верно заметил _nn_, то что mutable встречается в компиляторе часто не делает чести компилятору. Его код писался разными людьми которые в то время имели разный опыт. Если бы mutable было бы меньше, то качество проекта от этого было бы только выше.


Я лично не вижу прямой зависимости качества проекта от количества mutable (не Nemerle, а проектов в общем).

VD>Так что mutable неплохая лакмусовая бумажка выявляющая недостатки в коде. Это конечно не железное правило, но хорошая эвристика.
-- team zz
Re[5]: Макрос var как аналог для mutable
От: Ka3a4oK  
Дата: 29.05.11 08:38
Оценка:
VD>>Кроме того mutable используется и для полей. По умолчанию поля доступны только для чтения. Ну, и как верно заметил _nn_, то что mutable встречается в компиляторе часто не делает чести компилятору. Его код писался разными людьми которые в то время имели разный опыт. Если бы mutable было бы меньше, то качество проекта от этого было бы только выше.

ZS>Я лично не вижу прямой зависимости качества проекта от количества mutable (не Nemerle, а проектов в общем).


Прямой нет, косвенная — есть.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[6]: Макрос var как аналог для mutable
От: BogdanMart Украина  
Дата: 01.06.11 22:24
Оценка:
Здравствуйте, hardcase, Вы писали:

H>А мне нравится mutable его видно при объявлении. def/var по длине равны и потому заметить мутабельную переменную сложнее:



Оно то да, внутри метода. А вот поля класса делать мутабельными слегка напрягает (особенно когда портировали прогу с С#)
Re[7]: Макрос var как аналог для mutable
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.11 20:24
Оценка:
Здравствуйте, BogdanMart, Вы писали:

BM>Оно то да, внутри метода. А вот поля класса делать мутабельными слегка напрягает (особенно когда портировали прогу с С#)


Используй автосвойства.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Макрос var как аналог для mutable
От: BogdanMart Украина  
Дата: 03.06.11 20:26
Оценка:
Здравствуйте, VladD2, Вы писали:

BM>>Оно то да, внутри метода. А вот поля класса делать мутабельными слегка напрягает (особенно когда портировали прогу с С#)


VD>Используй автосвойства.


Ага, а из обычных свойств в обработчике обращаться к авто свойствам
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.