parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Временное решение

G_Z 29.05.2015 23:10 / 29.05.2015 23:15

Quick sort на Парсере.
@sort[table;compare][locals]
$data[^table.hash(^table.offset[])[$.type[table]]]
$result[^table::create[$table;$.limit(0)]]

^qsort[$data;$compare](0;$table - 1)

^data.foreach[;row]{
	^result.join[$row]
}


@qsort[data;compare;left;right][locals]
$base(($left + $right) \ 2)
$baserow[$data.$base.fields]

$l($left)
$r($right)

^while($l <= $r){
	^while(^compare[$data.$l.fields;$baserow] < 0){
		^l.inc[]
	}

	^while(^compare[$data.$r.fields;$baserow] > 0){
		^r.dec[]
	}

	^if($l <= $r){
		$tmp[$data.$l]
		$data.$l[$data.$r]
		$data.$r[$tmp]

		^l.inc[]
		^r.dec[]
	}
}

^if($left < $r){
	^qsort[$data;$compare]($left;$r)
}
^if($l < $right){
	^qsort[$data;$compare]($l;$right)
}
Пример функции сравнения:
@compare[one;two][locals]
$result(0)

$conditions[
	$.a[
		$.type[int]
		$.order[asc]
	]
	$.b[
		$.type[string]
		$.order[desc]
	]
]

^conditions.foreach[column;properties]{
	^if($result == 0){
		^switch[$properties.type]{
			^case[int]{
				^if($one.$column > $two.$column){
					$result(1)
				}($one.$column < $two.$column){
					$result(-1)
				}
			}
			^case[string;DEFAULT]{
				^if($one.$column gt $two.$column){
					$result(1)
				}($one.$column lt $two.$column){
					$result(-1)
				}
			}
		}

		^if($properties.order eq 'desc'){
			$result(-$result)
		}
	}
}
Пример:
$table[^table::create{a	b}]

^for[i](1;100){
	^table.append{^math:random(10)	^math:uid64[]}
}

$sorted[^sort[$table;$compare]]