parserALT
Страницы форума: ← Назад | 1 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 600 | Дальше →

^table.menu{}, разделитель и ^continue[]

#1Vint
29.07.09 17:27
www.parser.ru → | ответить → | в избранное →

^table.menu{}, разделитель и ^continue[]

Мне видится нелогичным, что разделитель выводится (или вычисляется, если он в фигурных скобках) при использовании оператора continue.
"Грубый" пример:
^table.menu{
     ^if(1 == 1){
          ^continue[]
     }
     $table.field
}[,]

Выводятся лишь запятые, а хотелось бы "пусто". Разделитель неудобно переносить в тело menu. Найдутся согласные со мной? Стоит ждать доработки языка?
#2Vint
→ Vint [#1] | 29.07.09 17:41
www.parser.ru → | ответить → | в избранное →
Как я понял, тут проблема в непустом теле menu. Т.е. если форматировать код иначе, то разделители не выведутся:
^table.menu{^if(1 == 1){^continue[]}
	$table.field
}[,]


Не очень красиво, хотелось бы, чтобы continue "обнулял" тело, но пока жить можно:-)
#3user
→ Vint [#2] | 29.07.09 17:50
www.parser.ru → | ответить → | в избранное →

в чем смысл конструкции?

опишите задачу для решения которой вы используете данный код, есть подозрение, что вы делаете что-то не так.
#4Vint
→ user [#3] | 29.07.09 18:02
www.parser.ru → | ответить → | в избранное →
Эм. Про смысл continue в доке написано. Да и я описал дословно, разве что пример "не живой". Что именно делаю не так?
#5CODer
→ Vint [#4] | 29.07.09 19:27
www.parser.ru → | ответить → | в избранное →

Для чего надо принудительно продолжать цикл?

#6Vint
→ CODer [#5] | 29.07.09 19:59
www.parser.ru → | ответить → | в избранное →
Обычный отбор по условию. locate в новую таблицу не всегда подходит.
Это касается не только таблиц, а любых циклов.
#7user
→ Vint [#6] | 29.07.09 20:55
www.parser.ru → | ответить → | в избранное →

хм...

давайте все-таки посмотрим на задачу?

например, лично мне никогда такое не требовалось.

разделитель в описанном вами примере работает логично - после каждой итерации печатаем разделитель.

непонятна ваша логика и задача
#8Vint
→ user [#7] | 29.07.09 21:22
www.parser.ru → | ответить → | в избранное →
Моё мнение, что continue -- пропущенная итерация => пустое тело => разделитель не выводится. Только вот пустое тело приходится формировать в коде руками.
Задача здесь не причём.
#9CODer
→ Vint [#8] | 29.07.09 21:54
www.parser.ru → | ответить → | в избранное →

А разве разделитель БЕЗ ^continue[] при пустой итерации выводится?

#10CODer
→ Vint [#8] | 29.07.09 21:55
www.parser.ru → | ответить → | в избранное →

И для чего указывать разделитель на каждой итерации, если внутри итерации хотите пустое тело?

#11user
→ Vint [#8] | 29.07.09 22:02
www.parser.ru → | ответить → | в избранное →

мне кажется, вы не правы

^continue[] = это продолжение выполнения цикла, это очевидно.

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

Вы думаете, что раз в вашем цикле вы полняете только пару команд(if/continue), то итерация типа "не настоящяя".
однако, это далеко не так. Раз выполнение кода в блоке началось, значит итерация состоялась.

В других языках continue означает тоже самое, то что там нет разделителя, ситуации не меняет.

Даже наличие break не отменяет факта итерации.
#12Vint
→ CODer [#10] | 29.07.09 22:05
www.parser.ru → | ответить → | в избранное →
continue может быть в середине тела. Собственно, он для того и придуман, что бы всё тело не оборачивать в большие if'ы (если несколько условий) или в несколько вложенных if'оф. В любой момент можно прервать итерацию.
А разделитель сам по себе удобен тем, что не нужно делать проверок на первую/последнюю строку (случай с таблицей) в теле.
Вот такой вот простой наглядности хочется. Увы, с парсерной идеологией "код внутри текста (тела вывода)" это не вяжется.
#13Vint
→ user [#11] | 29.07.09 22:08
www.parser.ru → | ответить → | в избранное →
Прочитайте внимательно в доке, в каких случаях отрабатывает разделитель. Не только сам факт начала итерации влияет на его вывод.
#14user
→ Vint [#12] | 29.07.09 22:10
www.parser.ru → | ответить → | в избранное →
^while(...){
	if(..){	
		$sDelimiter[,]
	}{
		$sDelimiter[]
	}
}
}{$sDelimiter}


чем это плохо?
#15user
→ Vint [#13] | 29.07.09 22:12
www.parser.ru → | ответить → | в избранное →
Ну да, формально там написано "выполняется перед каждым непустым не первым телом", а реально при второй и предпоследней итерации.

Это уже пусть разработчики языка внесут ясность в нашу дискуссию.
#16Vint
→ user [#15] | 29.07.09 22:21
www.parser.ru → | ответить → | в избранное →

Давно уже идёт просто флейм, пора завязывать.

Не формально, а как раз реально.
Я привёл рабочий пример своего же кода в самом начале.

Ваш пример (ниже по треду) не оптимален. Вычислимая запятая -- слишком дорого, хоть и спички:-)
Тогда уж проще всего:
^while(...){^if(..){
	code
}[$sDelimiter]

Ну, это при условии, что проверку можно сделать в самом начале.

P.S. Меня интересовал лишь один технический момент, возможно, Misha или Moko потом ответят.
#17user
→ Vint [#13] | 29.07.09 22:22
www.parser.ru → | ответить → | в избранное →

все правильно

$i(0)
^while($i<10){^i.inc[]^if(1==1){^continue[]  ololo }}[,]


Т.е. если тело содержит что-то, включая пробелы - то разделитель пропускается, иначе - ставиться.
#18user
→ user [#17] | 29.07.09 22:24
www.parser.ru → | ответить → | в избранное →

точнее, наоборот, но суть понятна )

#19Misha v.3
→ Vint [#16] | 30.07.09 10:55
www.parser.ru → | ответить → | в избранное →

я не понял, на что нужно ответить :)

всё работает как и задумано.
если вы формируете списки, то по моему очевидно, что вы сами должны позаботиться о том, чтобы туда не попадали пробельные символы, если они вам мешают.

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

в любом случае, если есть какое-либо предложение по изменению функционала, чтобы упростить подобные ситуации и не ломать текущую обратную совместимость -- в студию их :)
#20Vint
→ Misha v.3 [#19] | 30.07.09 14:22
www.parser.ru → | ответить → | в избранное →
Часто приходится формировать списки для запроса в БД. В таких случаях мне важнее читаемость кода, в ущерб объёма передаваемых данных (лишних пробельных символов).
Единственное, что могу предложить -- необязательный параметр операторам break и continue, с которым они не будут выводить тело текущей (прерванной) итерации и, соответственно, разделитель.
#21Misha v.3
→ Vint [#2] | 08.08.09 04:09 / 04:15
www.parser.ru → | ответить → | в избранное →

workaround

explicit result declaration -- в данном случае ваш друг, который сам удалит все пробельные символы, использующиеся для форматирования кода, из кода метода и они не будут мешать формированию separator-а.

@main[]
^z[^table::create{field
1
2
3
4
5}]


@z[table][result]
^table.menu{
	^if(^table.line[]>2){
		^continue[]
	}
	$table.field
}[,]


P.S. даже явно написанная запятая в данном случае не мешается :)
#22
→ Misha v.3 [#21] | 10.08.09 23:47
www.parser.ru → | ответить → | в избранное →

красиво, запомню, но...

но, во-первых, это отдельный метод, что не всегда удобно для нефункционального куска кода и, во-вторых: в моём представлении разрыв шаблона, когда объявлен result, но его как такового в методе не значится:-)
Проще отформатировать код.
Страницы форума: ← Назад | 1 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 600 | Дальше →