+153
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
function parse(input) {
var options = arguments.length > 1 ? arguments[1] : {},
peg$FAILED = {},
peg$startRuleFunctions = { grammar: peg$parsegrammar },
peg$startRuleFunction = peg$parsegrammar,
peg$c0 = peg$FAILED,
peg$c1 = null,
peg$c2 = [],
peg$c3 = function(initializer, rules) {
. . .
peg$c142 = { type: "other", description: "whitespace" },
peg$c143 = /^[ \t\x0B\f\xA0\uFEFF\u1680\u180E\u2000-\u200A\u202F\u205F\u3000]/,
peg$c144 = { type: "class", value: "[ \\t\\x0B\\f\\xA0\\uFEFF\\u1680\\u180E\\u2000-\\u200A\\u202F\\u205F\\u3000]", description: "[ \\t\\x0B\\f\\xA0\\uFEFF\\u1680\\u180E\\u2000-\\u200A\\u202F\\u205F\\u3000]" },
peg$currPos = 0,
peg$reportedPos = 0,
peg$cachedPos = 0,
peg$cachedPosDetails = { line: 1, column: 1, seenCR: false },
peg$maxFailPos = 0,
peg$maxFailExpected = [],
peg$silentFails = 0,
peg$result;
. . . // + 3К строк бреда до конца функции
История моих мытарств и жалких метаний:
Меня попросило начальство радикально улучшить формат в котором приложение хранит данные. Думал я, думал, и решил, что YAML ка нельзя лучше подходит для задачи (нужно хранить описание слайдов презентации, т.е. много текста и довольно схематичная графика, все это желательно бы иметь возможность комфортно редактировать в текстовом виде, создавать заготовки и т.д.).
Шаг первый: поиск готового YAML парсера, врезультате обнаружились две штуки для АС3. Один - клон Ява парсера, в котором по класу на токен. Я не шучу. Проект заброшен 5 лет назад. Второй: заброшен 4 года назад, все в одном файле, парсится регулярками и магией, какие-то комментарии имеются, но они только свидетельствуют о несостоятельности писавшего коментарии.
Подумал: если нет нормального парсера, может есть генератор парсеров?
Шаг второй: поиск обнаружил одну попытку написать клон ANTLR, но очень ограниченную, и не работающую.
Думаю: ну бля, если все так херово, может с ж.скрипта портирую чего-нибудь простенькое, PEG как раз должен подойти.
И тут я нашел это.
wvxvw,
21 Августа 2014
−163
- 1
- 2
- 3
- 4
- 5
Стр = Строка(Формат(ТекущаяДата(), "ДФ=гггг"))
+ Формат(ТекущаяДата(), "ДФ=ММ")
+ Формат(ТекущаяДата(), "ДФ=дд")+"_";
Стр = Стр + СтрЗаменить(Строка(Формат(ТекущаяДата(), "ДЛФ=В")),":","");
Мусьё знает толк. Очердной туроператор склеил ласты =)
safer_bwd,
20 Августа 2014
+134
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
String r_count = "";
String r_cat = "";
String r_pansion = "";
for (Int32 ii = 0; ii < rows.Count; ii++)
{
Int32 j = rows[ii].NNight;
DateTime d = rows[ii].DateBeg;
DateTime d_e = rows[ii].DateEnd;
Int32 type = rows[ii].MinLength > 0 ? 3 : 2;
j = (type == 3) ? -1 : j;
Int32 lengthMin = rows[ii].MinLength;
if (((d < date1 || d > date2) && type != 3))
continue;
else
if (!(d <= date1 && d_e >= date1 || d <= date2 && d_e >= date2) && date1 != DateTime.MinValue && date2 != DateTime.MaxValue && type == 3)
continue;
String _r_count = _Rooms[rows[ii].RoomId];
String _r_cat = _RoomCat[rows[ii].RoomCatId];
String _r_pansion = _Pansions[rows[ii].PansionId];
List<String> a = new List<string>();
if (_r_count != r_count || _r_cat != r_cat || _r_pansion != r_pansion)
{
if (!String.IsNullOrEmpty(r_count) && !String.IsNullOrEmpty(r_cat))
{
Pricing.RoomCat cat = new Pricing.RoomCat();
cat.RoomCount = r_count;
cat.RoomName = r_cat;
cat.PansionName = r_pansion;
p.rooms.Add(cat);
}
r_count = _r_count;
r_cat = _r_cat;
r_pansion = _r_pansion;
}
Краху туроператоров способствовали также и собственные инженеры.
tablecell,
20 Августа 2014
−158
- 1
- 2
- 3
- 4
Если Переменная1 <> 0 Тогда
Иначе
Переменная1 = 0;
КонецЕсли;
Пять минут пытался убедить нашу "программистку" с десятилетним стажем, что этот высер ничего не делает! Сошлись на том, что она "всё таки удалит его, но если появятся ошибки - она здесь не при чем"!
Этот кусок я бы и не заметил, если бы не бросился в глаза пустой блок "Тогда" при использовании блока "Иначе"
doom2good,
20 Августа 2014
+72
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
protected boolean matches(final PlasticField field) {
try {
return (this.type() == null) || this.type().getName().equals(field.getTypeName()) ? true : Class.forName(
this.type().getName()).isAssignableFrom(Class.forName(field.getTypeName()));
} catch (final ClassNotFoundException e) {
this.logger.error(e.getMessage(), e);
}
return false;
}
DRY in action
такая вот говнопластмасса
Lure Of Chaos,
20 Августа 2014
+153
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
if(!CModule::IncludeModule("iblock")) return;
$arFilter = array(
"IBLOCK_ID" => intval($arParams["IBLOCK_ID"]),
"SECTION_CODE" => "",
"PROPERTY_OWNER"=>CUser::GetId(),
);
$arSelect = Array("ID", "NAME", "PROPERTY_arrived", "PROPERTY_IDTRACK", "PROPERTY_OWNER");
$res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect);
$arResult = array();
while($ob = $res->GetNextElement())
{
$arFields = $ob->GetFields();
$data = array("TRACK"=>$arFields);
$arSelectHistroty = array("property_date","property_status_str","property_place","name");
$arFilterHistroty = array("IBLOCK_ID" =>$arParams["IBLOCK_ID_HISTORY"],"SECTION_CODE" => "","NAME"=>$arFields[ID]);
$resHistory = CIBlockElement::GetList(Array(), $arFilterHistroty, false, Array(), $arSelectHistroty);
while($history = $resHistory->GetNextElement()){
$history = $history->GetFields();
$data["HISTORY"][] = $history;
}
$arResult["ITEMS"][] = $data;
};
заведомо известно что в $arFields[ID] передается 1301
строка 17, если name маленькими буквами то ответ не правильный, т.е возвращает элементы с [NAME] => 1294.
но если NAME большими буквами, то ответ правильный: ****"SECTION_CODE" => "","NAME"=>1301); < часть ответа.
Ладно бы ничего не возвращал,...но с ошибкой..
Guron,
20 Августа 2014
+140
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 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
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
//block.exe
//divide information by bloks
#include<fstream>
#include <string>
#include <windows.h>
#include <ctime> // time
#include<iostream>
using namespace std;
int main()
{
FreeConsole();
//dati programe zapustitsia
char mask[255];
char maski1[255], maski2[255], maski3[255], maski4[255], maski5[255], maski6[255];
char maski7[255], maski8[255], maski9[255], maski10[255], maski11[255], maski12[255], maski13[255];
// [SKIPPED]
char maski250[255], maski251[255], maski252 [255], maski253[255], maski254[255], maski255[255];
char maski256[255];
char maski82[255], maski83[255],maski84[255],maski85[255], maski86[255], maski87[255];
string str2;
ifstream failpozovatelia("fail.txt");
while (!failpozovatelia.eof())
{
failpozovatelia>>mask;
cout<<mask<<endl;
ifstream rt(mask);
while (!rt.eof())
{
rt>>maski1>>maski2>>maski3>>maski4>>maski5>>maski6>>maski7>>maski8>>maski9>>maski10;
rt>>maski11>>maski12>>maski13>>maski14>>maski15>>maski16>>maski17>>maski18>>maski19>>maski20>>maski21;
rt>>maski22>>maski23>>maski24>>maski25>>maski26>>maski27>>maski28>>maski29>>maski30>>maski31;
rt>>maski32>>maski33>>maski34>>maski35>>maski36>>maski37>>maski38>>maski39>>maski40>>maski41>>maski42;
// SKIPPED
cout<<maski1<<maski2<<maski3<<maski4<<maski5<<maski6<<maski7<<maski8<<maski9<<maski10;
cout<<maski11<<maski12<<maski13<<maski14<<maski15<<maski16<<maski17<<maski18<<maski19<<maski20<<maski21;
cout<<maski22<<maski23<<maski24<<maski25<<maski26<<maski27<<maski28<<maski29<<maski30<<maski31;
cout<<maski32<<maski33<<maski34<<maski35<<maski36<<maski37<<maski38<<maski39<<maski40<<maski41<<maski42;
// SKIPPED
ofstream blockfaila("block.txt",ios::out);
{
blockfaila<<maski1<<maski2<<maski3<<maski4<<maski5<<maski6<<maski7<<maski8<<maski9<<maski10;
blockfaila<<maski11<<maski12<<maski13<<maski14<<maski15<<maski16<<maski17<<maski18<<maski19<<maski20<<maski21;
blockfaila<<maski22<<maski23<<maski24<<maski25<<maski26<<maski27<<maski28<<maski29<<maski30<<maski31;
blockfaila<<maski32<<maski33<<maski34<<maski35<<maski36<<maski37<<maski38<<maski39<<maski40<<maski41<<maski42;
blockfaila<<maski43<<maski44<<maski45<<maski46<<maski47<<maski48<<maski49<<maski50<<maski51<<maski52;
// SKIPPED
}
Sleep(128);
blockfaila.close();
//wait other opration while done.
a:
ifstream nextblock("nextblock.txt");
{
nextblock>>str2;
}
string sub3 = "*";
unsigned int pos2 = str2.find(sub3,0);
cout << " You have enter " << str2 << endl;
if(pos2 != string::npos)
{
{
Sleep(128);
}
else
{goto a;
}
}
}
return 0;}
12 это 35 это 7876...
126321 124 351895321 84 42 21 11 6 3 2 1 52 26 13 7 421 8+16=32 32 16 8 4 2 1
00100 1 0 10 100 4+16+64=84 0 0 1 1 0 10 0 0 0 1 0 1000 0 0 0 0 0 0
821 32 168 4 2 1
обратно если длины нехватает береш двух значнае, все рабоботает, пересчитай, если не сжимается минусуешь минус 10 и пробуешь сжать снова сжать.
TarasB,
19 Августа 2014
+143
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
Монады как коллбеки
На джаваскриптовой конференции, о которой я писал в прошлом посте, в процессе обсуждения
ФП неизбежно встала тема монад.
Мне было интересно, насколько легко можно объяснить монады «на пальцах». Возможно, не в
той степени, чтобы человек смог сразу с ними программировать, но в той степени, чтобы понимать,
что они делают и зачем нужны.
И у меня возникла идея объяснить монады без типов. Мне кажется, главную сложность при изучении
монад вызывают именно типы (а точнее, конструкторы типов и классы конструкторов типов), т.к. многие
приходят в Haskell из языков с менее выразительной системой типов.
В то же время, монады могут существовать и в динамических языках. А если из монад убрать типы,
то останется лишь то, как они работают во время исполнения — и там все довольно прозрачно.
Вычислительная сущность монад — это continuation passing style, или коллбеки. Любая программа
на node.js написана в этом стиле.
Левый аргумент >>= — вычисление, а правый — коллбек. Коллбек принимает результат вычисления
и совершает какие-то дальнейшие вычисления
Эта аналогия особенно точно выполняется для монад Identity, IO, Maybe/Either. Каждая отдельная
монада определяет, к чему конкретно будет применен коллбек.
Но посмотрим, например, на монаду [] (список). Если руководствоваться только лишь представлением
о монаде как о вызове коллбеков, то самый простой способ определить списочную монаду — это a >>= k = map k a (что неверно).
Аналогия с коллбеками слишком «императивна» и не улавливает тонкость — структуру самой монады.
Чтобы эту структуру наглядно показать, как раз и нужны типы.
kegdan,
19 Августа 2014
−159
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
my @args = (
one => 1,
two => 2,
three => 3,
);
croak(q/'hashes' only/) if (@args & 1);
my $args = join ';', map { join '=', @args[$_, $_ + 1] } grep { !($_ & 1) } 0 .. $#args;
Осилил, блин...
Elvenfighter,
19 Августа 2014
+159
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
$(function () {
$('#Who').click(whoAre);
});
function whoAre() {
var who = document.getElementById('whoAreyou');
var value = who.style.display;
var aspnetRoles = document.getElementById('aspnetRoles');
if (value == "none") {
who.style.display = "block";
aspnetRoles[0].value = "Агент";
aspnetRoles[1].value = "Арендодатель";
aspnetRoles[0].text = "Агент";
aspnetRoles[1].text = "Арендодатель";
} else {
who.style.display = "none";
aspnetRoles[0].value = "Moderator";
aspnetRoles[1].value = "Moderator";
aspnetRoles[0].text = "Moderator";
aspnetRoles[1].text = "Moderator";
}
}
меняет элементы, option
Emir,
19 Августа 2014