Начал подозревать ещё по заголовку и теме статьи, больше на хабре вроде бы никто про путешествия не рискует писать. Позже заметил, что слог подозрительно милфгардовский.
Что можно почитать научно-популярного на тему алгоритмов, применяющихся для поиска структур?
К примеру, есть последовательность 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, «что видишь, то и получишь») — свойство прикладных программ или веб-интерфейсов, в которых содержание отображается в процессе редактирования и выглядит максимально близко похожим на конечную продукцию, которая может быть печатным документом, веб-страницей или презентацией. В настоящее время для подобных программ также широко используется понятие «визуальный редактор».
Когда вы выделяете в MS Word фрагмент текста, жмёте кнопку полужирного текста и выделенный фрагмент начинает отображаться на экране полужирным шрифтом — это WYSIWYG.
Когда вы выделяете фрагмент текста в поле ввода комментария на Хабрахабре и оный фрагмент обрамляется тегами <b>...</b> — это НЕ WYSIWYG.
Даже свой пост против WISIWIG вы все-таки писали в WISIWIG-редакторе.
Вы не автору статьи отвечали, так что никаких «постов против WISIWIG» он не писал.
Поле ввода комментария тут WYSIWYG не является.
Так много букв, но так и не раскрыт смысл ограничения. Специалисты по противодействию социнжинирингу наивно полагают, что у злодейских злодеев-хакеров-социнженеров не найдётся подходящего ящика?
Генерация PDF как-то костыльно выглядит.
Доктор на Ruby, но для генерации PDF будьте любезны установить Node.js с браузером.
TeX в PDF более естественным путём превращается.
систему онлайн документации без какого либо формата.
Вам не важны результаты работы? Как вы резервные копии «без формата» делать будете?
Рано или поздно любой онлайн-сервис прекратит деятельность.
Если повезёт — предупредят за пол-года, не повезёт — просто в один прекрасный понедельник вместо онлайн-сервиса увидите «Сервер не найден вместе со всеми вашими документами. Спасибо, что пользовались нашими услугами».
На работе строишь-строишь 40 часов в неделю хрустальные замки абстракций, в конце недели приходишь к друзьям поиграть-отвлечься, а там кругом станки-станки-станки...
Почему обязательно «делать быстрее»?
Ценный жизненный опыт может подсказать, что SPA это не то, на что стоит тратить своё драгоценное время, даже если за это готовы заплатить. Благо, в IT помимо фронтенда есть куча всего разного.
Есть код, который должен легко читаться человеком без знания английского.
Можете привести пример, когда это необходимо?
Мне довелось пересечься с одним разработчиком, совсем не владевшим английским языком и он был настолько плох, что не смог преодолеть испытательный срок. Вряд ли есть смысл ориентироваться на подобных разработчиков.
С нетерпением жду открытия на хабре раздела «Светская жизнь». С подробными рассказами кто с кем пил, с кем шашни крутил, кого на свадьбу пригласил, кого на капоте прокатил. Судя по всему, ждать осталось недолго.
Здоровье бизнесмен поддерживает и благодаря купанию в ледяной воде — каждую зиму Дуров отправляется для этого в Финляндию или Швейцарию.
Я выполнил тестовое задание (и как мне кажется хорошо)
Давайте посмотрим.
При оценке работы будет оцениваться:
…
Качество исходного кода и наличие тестов;
Когда говорят о «наличии тестов», то чаще всего подразумевают 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, на сколь-нибудь сложном коде это черевато утечками памяти.
Не работает, так что вопрос остаётся в силе.
Начал подозревать ещё по заголовку и теме статьи, больше на хабре вроде бы никто про путешествия не рискует писать. Позже заметил, что слог подозрительно милфгардовский.
Что можно почитать научно-популярного на тему алгоритмов, применяющихся для поиска структур?
К примеру, есть последовательность
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» это давно устоявшийся термин, не стоит пытаться наделить его самопальными смыслами.
(Цитата из https://ru.wikipedia.org/wiki/WYSIWYG)
Когда вы выделяете в MS Word фрагмент текста, жмёте кнопку полужирного текста и выделенный фрагмент начинает отображаться на экране полужирным шрифтом — это WYSIWYG.
Когда вы выделяете фрагмент текста в поле ввода комментария на Хабрахабре и оный фрагмент обрамляется тегами
<b>...</b>— это НЕ WYSIWYG.Вы не автору статьи отвечали, так что никаких «постов против WISIWIG» он не писал.
Поле ввода комментария тут WYSIWYG не является.
А экран зачем, лицо роботу рисовать?
Так много букв, но так и не раскрыт смысл ограничения. Специалисты по противодействию социнжинирингу наивно полагают, что у злодейских злодеев-хакеров-социнженеров не найдётся подходящего ящика?
Генерация PDF как-то костыльно выглядит.
Доктор на Ruby, но для генерации PDF будьте любезны установить Node.js с браузером.
TeX в PDF более естественным путём превращается.
не туда
Вам не важны результаты работы? Как вы резервные копии «без формата» делать будете?
Рано или поздно любой онлайн-сервис прекратит деятельность.
Если повезёт — предупредят за пол-года, не повезёт — просто в один прекрасный понедельник вместо онлайн-сервиса увидите «Сервер не найден вместе со всеми вашими документами. Спасибо, что пользовались нашими услугами».
Можно и незнакомым, только симку часто восстанавливать придётся.
На работе строишь-строишь 40 часов в неделю хрустальные замки абстракций, в конце недели приходишь к друзьям поиграть-отвлечься, а там кругом станки-станки-станки...
Вы излишне пессимистичны.
Ценный жизненный опыт может подсказать, что SPA это не то, на что стоит тратить своё драгоценное время, даже если за это готовы заплатить. Благо, в IT помимо фронтенда есть куча всего разного.
Всегда думал, что это называется «агент влияния». А медиатор это что-то из биохимии, нейробиологии или музыки.
Можете привести пример, когда это необходимо?
Мне довелось пересечься с одним разработчиком, совсем не владевшим английским языком и он был настолько плох, что не смог преодолеть испытательный срок. Вряд ли есть смысл ориентироваться на подобных разработчиков.
С нетерпением жду открытия на хабре раздела «Светская жизнь». С подробными рассказами кто с кем пил, с кем шашни крутил, кого на свадьбу пригласил, кого на капоте прокатил. Судя по всему, ждать осталось недолго.
Как бизнесмен попал в "Здоровье гика"?
Давайте посмотрим.
Когда говорят о «наличии тестов», то чаще всего подразумевают unit tests.
В Java для это есть фреймворк JUnit, в Delphi — DUnit, в FreePascal — fpcunit.
У вас же просто батник, запускающий примеры из папки
tests, это несколько не то.Некоторое время на изучение теории выделить всё же стоит.
При парсинге у вас модифицируется входная строка, это явный признак того, что вы делаете что-то не так.
Стоит только добавить строковые литералы, как вызовы
StringReplace()станут очень некстати. Сейчас же они просто лишние.При этом вы не запоминаете позицию, на которой закончили в предыдущий вызов
GetToken()и каждый раз начинаете обрабатывать строку с начала, хотя это совершенно избыточно.Более того,
GetToken()иFillSpaces()вообще не имело смысла писать. Обе функции имеют готовые реализации в FPC — ExtractWord() и StringOfChar() соответственно.В Java и вовсе можно было взять StringTokenizer и получить лексер бесплатно.
К слову о правильности выбора языка.
В классах у вас все поля публичные, что не очень хорошая практика.
Тем более что декларация
propertyэто всего лишь одна дополнительня строка.Поле
OpRegиспользуется для хранения ссылок на экземпляры классовTGuuOpиTGuuVar, но при этом почему-то имеет типPointer.А так как
TGuuOpиTGuuVarне имеют ничего общего, то возникает вопрос, почему ссылки на них хранятся в одном и том же поле.Приводить целое число к перечислимому типу — плохая практика, по возможности стоит этого избегать.
Функция
AnsiIndexStr()может вернуть в качестве значения-1, в этом случае вOpTypeвместо значения будет лежать мусор, не представимый типомTGuuToken. Вcaseможно было использовать результатAnsiIndexStr()напрямую.В конструкторе лучше ограничиться минимальной инициализации, а основную работу делать в отдельном, явно вызываемом методе.
Так будет проще отлаживать, у вас всегда будет корректно созданный объект, хранящий текущее состояние.
Единственный поддерживаемый тип переменных — целое число, но вы зачем-то храните значение в поле типа
Variant.Переменные вы храните в линейном списке, это потенциальные проблемы с производительностью на пустом месте. Хеш-таблица с именем переменной в качестве ключа здесь подошла бы больше.
Т.к. тестовое задание призвано показать качество кода, который вы можете порождать, то это имеет значение даже для интерпретатора игрушечного языка.
Время жизни объектов у вас не защищено блоками
try ... finally, на сколь-нибудь сложном коде это черевато утечками памяти.Это то, что бросилось в глаза при беглом осмотре.