Обновить
-13
1.4

Пользователь

Отправить сообщение

Не работает, так что вопрос остаётся в силе.

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

Что можно почитать научно-популярного на тему алгоритмов, применяющихся для поиска структур?
К примеру, есть последовательность 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97. Как определить, можно ли её описать короткой формулой или нет?

Все хорошо до примеров. Потом — плохо.… кину коллегам.

Похоже на хокку.

«WYSIWYG» это давно устоявшийся термин, не стоит пытаться наделить его самопальными смыслами.


WYSIWYG (произносится [ˈwɪziwɪɡ], является аббревиатурой от англ. What You See Is What You Get, «что видишь, то и получишь») — свойство прикладных программ или веб-интерфейсов, в которых содержание отображается в процессе редактирования и выглядит максимально близко похожим на конечную продукцию, которая может быть печатным документом, веб-страницей или презентацией. В настоящее время для подобных программ также широко используется понятие «визуальный редактор».

(Цитата из https://ru.wikipedia.org/wiki/WYSIWYG)


Когда вы выделяете в MS Word фрагмент текста, жмёте кнопку полужирного текста и выделенный фрагмент начинает отображаться на экране полужирным шрифтом — это WYSIWYG.


Когда вы выделяете фрагмент текста в поле ввода комментария на Хабрахабре и оный фрагмент обрамляется тегами <b>...</b> — это НЕ WYSIWYG.


Даже свой пост против WISIWIG вы все-таки писали в WISIWIG-редакторе.

Вы не автору статьи отвечали, так что никаких «постов против WISIWIG» он не писал.
Поле ввода комментария тут WYSIWYG не является.

А экран зачем, лицо роботу рисовать?

Так много букв, но так и не раскрыт смысл ограничения. Специалисты по противодействию социнжинирингу наивно полагают, что у злодейских злодеев-хакеров-социнженеров не найдётся подходящего ящика?

Генерация PDF как-то костыльно выглядит.
Доктор на Ruby, но для генерации PDF будьте любезны установить Node.js с браузером.
TeX в PDF более естественным путём превращается.

систему онлайн документации без какого либо формата.

Вам не важны результаты работы? Как вы резервные копии «без формата» делать будете?


Рано или поздно любой онлайн-сервис прекратит деятельность.
Если повезёт — предупредят за пол-года, не повезёт — просто в один прекрасный понедельник вместо онлайн-сервиса увидите «Сервер не найден вместе со всеми вашими документами. Спасибо, что пользовались нашими услугами».

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

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

Почему обязательно «делать быстрее»?
Ценный жизненный опыт может подсказать, что SPA это не то, на что стоит тратить своё драгоценное время, даже если за это готовы заплатить. Благо, в IT помимо фронтенда есть куча всего разного.
Медиаторы: МИФ имеет базу читателей, способных повлиять на других.

Всегда думал, что это называется «агент влияния». А медиатор это что-то из биохимии, нейробиологии или музыки.

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

Можете привести пример, когда это необходимо?
Мне довелось пересечься с одним разработчиком, совсем не владевшим английским языком и он был настолько плох, что не смог преодолеть испытательный срок. Вряд ли есть смысл ориентироваться на подобных разработчиков.

Середина 2019 года на дворе, мобильных телефонов с двумя физическими SIM-картами как грязи.
Граммофон в это время будет наигрывать «Беломорс — Термоядерный рассвет».

С нетерпением жду открытия на хабре раздела «Светская жизнь». С подробными рассказами кто с кем пил, с кем шашни крутил, кого на свадьбу пригласил, кого на капоте прокатил. Судя по всему, ждать осталось недолго.


Здоровье бизнесмен поддерживает и благодаря купанию в ледяной воде — каждую зиму Дуров отправляется для этого в Финляндию или Швейцарию.

Как бизнесмен попал в "Здоровье гика"?

Я выполнил тестовое задание (и как мне кажется хорошо)

Давайте посмотрим.


При оценке работы будет оцениваться:

Качество исходного кода и наличие тестов;

Когда говорят о «наличии тестов», то чаще всего подразумевают unit tests.
В Java для это есть фреймворк JUnit, в Delphi — DUnit, в FreePascal — fpcunit.
У вас же просто батник, запускающий примеры из папки tests, это несколько не то.


Я бы не сказал, что оно сложное, скорее наоборот. Оно не требует каких-либо глубоких знаний теории построения трансляторов и крутого скилла.
Несмотря на то, что JB дают аж целых 7 дней, по времени у меня в сумме ушло около часа, а проект получился примерно в 500 строк кода.

Некоторое время на изучение теории выделить всё же стоит.
При парсинге у вас модифицируется входная строка, это явный признак того, что вы делаете что-то не так.
Стоит только добавить строковые литералы, как вызовы StringReplace() станут очень некстати. Сейчас же они просто лишние.


При этом вы не запоминаете позицию, на которой закончили в предыдущий вызов GetToken() и каждый раз начинаете обрабатывать строку с начала, хотя это совершенно избыточно.
Более того, GetToken() и FillSpaces() вообще не имело смысла писать. Обе функции имеют готовые реализации в FPC — ExtractWord() и StringOfChar() соответственно.


В Java и вовсе можно было взять StringTokenizer и получить лексер бесплатно.
К слову о правильности выбора языка.


type
 TGuuOp = class
   public

     OpType         : TGuuToken;
...
     OpReg          : Pointer;

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


Поле OpReg используется для хранения ссылок на экземпляры классов TGuuOp и TGuuVar, но при этом почему-то имеет тип Pointer.
А так как TGuuOp и TGuuVar не имеют ничего общего, то возникает вопрос, почему ссылки на них хранятся в одном и том же поле.


OpType := TGuuToken(AnsiIndexStr(s, GuuToken));

Приводить целое число к перечислимому типу — плохая практика, по возможности стоит этого избегать.
Функция AnsiIndexStr() может вернуть в качестве значения -1, в этом случае в OpType вместо значения будет лежать мусор, не представимый типом TGuuToken. В case можно было использовать результат AnsiIndexStr() напрямую.


После того, как было написано объявление класса — я решил, что наиболее компактным и красивым решением было бы дописать парсер и небольшой синтаксический анализ в его конструкторе, что я дальше и сделал:

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


type
 TGuuVar = class
   public
     gvName: string;
     gvVal: variant;
     constructor Create(VarName: string);
 end;

Единственный поддерживаемый тип переменных — целое число, но вы зачем-то храните значение в поле типа Variant.


var
 GuuVars: TList;

Переменные вы храните в линейном списке, это потенциальные проблемы с производительностью на пустом месте. Хеш-таблица с именем переменной в качестве ключа здесь подошла бы больше.


Т.к. тестовое задание призвано показать качество кода, который вы можете порождать, то это имеет значение даже для интерпретатора игрушечного языка.


Время жизни объектов у вас не защищено блоками try ... finally, на сколь-нибудь сложном коде это черевато утечками памяти.


Это то, что бросилось в глаза при беглом осмотре.

Информация

В рейтинге
1 427-й
Зарегистрирован
Активность