Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Идиотизмы

Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Оценить эту запись

Загадочный CommaExpression

Запись от BlooDHounD размещена 06.09.2010 в 14:16
Обновил(-а) BlooDHounD 07.09.2010 в 00:17

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

для начала расскажу как и где может применяться CommaExpression.

самое распространённое применение он обрёл конечно же в объявлении переменных:
Код AS3:
var i:int = 5, j:int = 2;
но на самом деле это чуть ли самая примитивная конструкция языка. по спецификации её можно применять повсеместно:
Код AS3:
for ( i=0, j=10; i<j; i++, j-- ) {
}
Код AS3:
var x:XML = describeType( someObject );
var n:String;
var list:XMLList = x.*.( n = name(), n == 'accessor' || n == 'variable' || n == 'constant' ); // выдёргиваем все свойства
эти 2 примера очень хорошо иллюстрируют полезность данного выражения.



Что же он из себя представляет?

на самом деле запятая заменяет точку с запятой. но увы, точку с запятой мы можем использовать далеко не всегда, так как они является самостоятельной конструкцией, необходимой в большой части языка ( например в циклах ). так же мы не можем её вставлять посреди других выражений ( например внутри скобок ). как раз для таких случаев и придуман CommaExpression. его можно пихать абсолютно везде. даже вместо точки с запятой ( но я этого не рекомендую. это просто возможность ). кроме синонима точки с запятой, он ещё и несёт функциональную нагрузку. вот простенький пример:
Код AS3:
var j:int = 0;
var i:int = ( j += 5, j-1 );
trace( i ); // 4
в скобках записаны 2 выражения. выполниться они должны последовательно. но результатом всего CommaExpression будет всегда последнее выражение. таким образом мы могли напихать ещё уйму выражений ( которые обязаны были бы выполниться ), но в переменную i записался бы результат последнего выражения. именно этот приём и используется в примере с e4x выше. сперва идёт сохранение в промежуточную переменную, а потом она используется в результирующем выражении.



А теперь к проблемам компилятора

так как CommaExpression, можно использовать повсеместно Женя, видимо попытался испробовать его во всяких ситуациях. в тех ситуациях, что он мне скинул, юзать его конечно бессмысленно, но факт возможности мы не исключаем. все обнаруженные ситуации связаны с булевыми проверками:
Код AS3:
if ( trace( '1' ), true ) {
	trace( '2' );
}
 
if ( trace( '1' ), false ) {
	trace( '2' );
}
ясное дело, что "1" я ни разу не увидел. задумался. вспомнил, про то, что компилятор оптимизирует условия. соответственно он убирает оператор if и вместе с ним используемые в нём не булевые выражения. "усложнил" и код и всё заработало:
Код AS3:
if ( trace( '1' ), !false ) {
	trace( '2' );
}
 
if ( trace( '1' ), !true ) {
	trace( '2' );
}
начал разбираться с другим примером, который не менее загадочен, и в котором я точно так же не увидел "1":
Код AS3:
var k:int = 0;
if ( trace( '1' ), ++k == 1 ) {
	trace( '2' );
}
почему он не работает, я совсем не понял. глубоко разбираться не полез. просто нашёл лекарство в виде обёртки в скобки.
Код AS3:
var k:int = 0;
if ( trace( '1' ), ( ++k == 1 ) ) {
	trace( '2' );
}
Всего комментариев 8

Комментарии

Старый 07.09.2010 08:50 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Познавательно, спасибо =)
В последнем выражении у меня мысль есть что "оптимизация" происходит тоже, из за какого-то бага, похоже. Вот так:

Код AS3:
var k:int = 0;
if ( trace( '1' ), ++k ) {
	trace( '2' );
}
1, 2.

Факт в том, что в abc код первый трейс совсем не вкомпиливается.
Старый 07.09.2010 10:44 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
спасибо, Кэп! а я думал, что он не вкомпиливается по собственной глупости!
Старый 07.09.2010 13:24 i.o. вне форума
i.o.
 
Аватар для i.o.
А в чем, собственно, удобство CommaExpression?
Старый 07.09.2010 14:45 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
ну как бы можно прочитать пост и ознакомиться с примерами. особенно с примером e4x.
Старый 07.09.2010 16:39 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Блуд, я очень верю в то, что ты знаешь куда больше меня и уж наверняка в abc код заглянул, чтобы посмотреть, вкомпилилось ли.

Дело в том, что твой блог, как и флешер в общем, порой читают подрастающие девелоперы и у них может возникнуть ошибочное впечатление, что trace вкомпиливается, но почему-то не вызывается. Мой пост был призван скорее помочь им.
Старый 07.09.2010 17:12 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Psycho Tiger, прошу прощения за резкость.
Старый 09.09.2010 22:51 dimarik вне форума
dimarik
 
Аватар для dimarik
trace вкомпиливается.
Старый 09.09.2010 23:16 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Код AS3:
package  
{
	import flash.display.Sprite;
 
	public class Main extends Sprite
	{
 
		public function Main() 
		{
			super();
			var k:int = 0;
			if ( trace( '1' ), ++k == 1 ) {
				trace( '2' );
			}
		}
 
	}
 
}
Код:
debugfile D:\!Projects\JustTest\src;;Main.as
debugline 12
  //    public function Main() 
getlocal0 
pushscope 
debug 1,k,0,15
debugline 14
  //     super();
getlocal0 
constructsuper 0
debugline 15
  //     var k:int = 0;
pushbyte 0
convert_i 
setlocal1 
debugline 16
  //     if ( trace( '1' ), ++k == 1 ) {
getlocal1 
increment_i 
dup 
convert_i 
setlocal1 
pushbyte 1
ifne LOC_1:
debugline 17
  //      trace( '2' );
findpropstrict trace
pushstring 2
callproperty trace,1
pop 
debugline 19
  //    }
returnvoid
У меня нету. Смотрю через Yogda. dimarik, ты уверен что проверял случай без скобок?
Компилю под 10 плеер, mxmlc, 4 flexSDK.
 

 


Часовой пояс GMT +4, время: 10:28.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.