- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
public Match(source:SourceLexemes, namedLinkDictionary:NamedLinkDictionary, settings:MatchSettings):MatchResult
def endMatchingBlockLexemesByType = settings._endMatchingBlockLexemesByType;
def endMatchingBlockLexemesByValue = settings._endMatchingBlockLexemesByValue;
assert([_beginOfMatchBlock, _endOfMatchBlock].ForAll(excludedItem => !endMatchingBlockLexemesByValue.Contains(excludedItem)));
def matchLexeme(amountOfEntryBlock=0, matchedLexemes=[], sourceTail=source)
|(0, _::_, _) => Some(matchedLexemes, sourceTail)
|(_, _, lexeme_::_) when endMatchingBlockLexemesByType.Contains(lexeme_._type) => None()
|(_, _, lexeme_::lexemes_) =>
match(lexeme_._value, amountOfEntryBlock)
|(value_, _) when endMatchingBlockLexemesByValue.Contains(value_) => None()
|(_beginOfMatchBlock, _) => matchLexeme(amountOfEntryBlock+1, lexeme_::matchedLexemes, lexemes_)
|(_endOfMatchBlock, 0) => None()
|(_endOfMatchBlock, _) => matchLexeme(amountOfEntryBlock-1, lexeme_::matchedLexemes, lexemes_)
|(_, 0) => None()
|(_, _) => matchLexeme(amountOfEntryBlock, lexeme_::matchedLexemes, lexemes_)
|_ => None()
|_ => None()
match(matchLexeme())
|None => MatchResult.Failure(source, namedLinkDictionary)
|Some((matchedLexemes_, unmatchedLexemesTail_)) => MatchResult.Success(unmatchedLexemesTail_, updateNamedLinkDictionary(matchedLexemes_, namedLinkDictionary))
Вчера заглянул в свой код.
Есть один язык, так вот в нем паттерн-матчинг задается на уровне сигнатур функций.
В связи с тем, что я каждую ночь читал книгу по кулХацкелу, то то что там было написано - вьелось мне в подкоррку и я этого даже не заметил.
По ночам когда читаешь что-то, оно проникает в незащищенное подсознание. Я даже не ожидал, что напишу такой код. Но я его написал и только опосля понял, что с кодом что-то не так.
Беда пришла оттуда, откуда её не ждали.
Ещё я больше не могу без таких функций, как id или ($) или (.) или стрелочка\рыбка. Меня все это конечно раздражает... Мне кажется, что меня держут в клетке и не дают пользоваться правильными функциями.
Я всегда считал, что зашквар и профессиональная деформация может быть только от крестов.
Похоже я очень сильно ошибался и поплатился за это.
Что посоветуете?
http://govnokod.ru/12031
создал временные переменные, а потом их использовал в качестве возвращаемых значений функции. То есть не зависимо от результата выполнения у меня всегда создавалась лишние переменные, которые могли бы не создаваться и нетратить лишнее процессорное время на это каждый раз в глубоко вложеннном цикле и темболее не создавалась бы работа для сборщика мусора, постоянно удаляющего эти лишние ненужные переменные.
А привычка то появилась, после того, как посидел в ленивом языке Haskell, в котором эти лишние переменные создаваться бы не стали, тк их не использовали.
, то сколько кода это займёт на императивном или любом другом нормальном языке или просто в красивом стиле?
Функция просто ищит в потоке лексем первой лексемой _beginOfMatchBlock (например открывающася скобка). Если не нашла, то возвращает фейл, а если нашла, то смотрит, пропуская прочие лексемы, пока есть открывающиеся скобки и так находит последнюю парную закрывающуюся скобку (_endOfMatchBlock). Если список лексем закончился раньше, нахождения парной скобки, то засчитывает слив. В случае поражения возвращает список лексем неизменным, а если успех, то возвращет остаток лексем. Факт слива тоже возвращается.
Посоны, может в этом коде нет говна? Вот 2 человека мне уже пытаются льстить. Я уже начинаю верить, что я прав, а просто 5 человек, что проплюсовали - типичное быдло, что не понимает в функциональный код?
Кто тут четкие функциональщики, рассудите а?
Вот мне уже начинает казатся, что код написан хорошо и правильно. И я его даже могу читать легко.
Между прочим код чистый и даже без исключений. Что ещё нужно?
> |(0, _::_, _)
Это паттернматчинг по аргументам функции?
> ::
Что делает этот оператор?
>Это паттернматчинг по аргументам функции?
Да. Писать match(переменная) в функции не нужно, если первый же оператор матчинг "|".
Матчинг доступен, тк все функции каррированны, поэтому аргументы представляют собой один кортеж. Поэтому это матчинг по одной переменной. Фактически ты можешь вызвать функцию f(args), если args - кортеж из аргументов, а можешь написать f(arg1,arg2,...).
>> ::
>Что делает этот оператор?
Cons из lisp, : из Haskell. То есть добавление элемента в список.
Я тоже так думал, но крайне мощное метапрограммирование (лисп и рядом не стоял) и вывод типов позволило и ещё позволит сделать очень широкую автоматизированную библиотеку. Фактически весь язык и вся стандартная библиотека уже написана на макросах. Жаль метапрограммировать тяжело на нем. Я пока не осилил. Но использование готового (из автоматизации, расширенных проверок во время компиляции и библиотек) уже даёт о себе знать.
Если полистать блог хацкеля на хабре, легко заметить, что 99% статей - решение абстрактных студентозадач в вакууме, и лишь 1% - реальные success-story, от которых захватывает дух.
Хотел бы я, чтобы было меньше споров о крутотени ФЯ и больше действительно удобного софта, написанного на этом отличном (с моей точки зрения) семействе языков.
И кстати, вместе с mono никаких проблем не будет?
fxd
Запускать скомпилированные программы под моно можно, а вот компилятор под моно не работает. Может в новых версиях моно исправили это, но сомневаюсь. Класс ответственный за emit кода в моно с багами. Не соответствует .net'овскому. Под JVM вроде порт компилятора скоро выйдет (может уже вышел), так что тоже в перспективе не проблема.
Подсветка, автодополнение кода, формашлепка в студии работает хорошо для опенсорсного свободного продукта.
Чем?
Из плюсов (конкретно для меня):
+ Необычный синтаксис
+ Множество возможностей
+ Мультипарадигмальность
+ Удобная работа в системе Windows
Из минусов (опять-же, для меня):
- Привязка к .NET
- Документации меньше, чем к тому-же хаскелю
- Огромные проблемы с программированием на Nemerle в Linux
Есть ли что-нибудь похожее, но без этих недостатков?
Программировать под линухом можно, но в каком-нибудь вайне скорее всего или виртуальной машине.
По способностям близок только Lisp, кроме того, что он динамически типизированный. Может быть таким же мультипарадигменным. И так же сильно метапрограммировать, как и Nemerle.
Из альтернатив:
F#/OCaml или Scala
Но вроде как 2 парадигмы в обоих и не более. Притом первый больше поощряет ФЯ. Про второй Роман тебе расскажет.
Т.е. я соберу под вайном хеловорлд.ехе и потом его тоже запущу под вайном? No way.
Нет, запустишь под моно в линухе без вайнов.
Хватит уже метапрограммировать, найди себе девушку.
В жизни всё происходит через жопу - сначала ты добиваешься девушки, потом находишь как-нибудь от нее избавиться.
>потом находишь как-нибудь от нее избавиться
Показать fluent-interface. Не:?
Устройство монады IO. Правда есть возможность, что она обладает настолько извращенным сознанием, что ей это понравится... тогда пункт про избавление можно и отменить.
Пффф. Нашел чем пугать. Да и монда IO её врятли испугает. Счас подумаю, что есть посложнее...
>Пффф. Нашел чем пугать.
Я вот и говорю никакой ты не олдфаг, а простое гумно, которое начиталось старых тредов.
Только неофитов и долбоёбов, которым нечего больше обсуждать заботят вопросы "олдфажности", люди которые тут сидят с самого начала никогда этим не кичились.
Кофнуций.
Если интересно именно метапрограммирование и функциональность, можно поглядеть Clojure, он тоже на JVM.
Как вариант можно посмотреть Haskell (разрыв шаблона гарантирован), он относительно кроссплатформенный.
Даже без Template Haskell разрыв гарантирован, но метапрограммирование там не на что негодное. Я бы даже сказал, его нет. Но разрывы действительно будут.
А если программировать с Template Haskell, то сказать не могу, возможно будет хорошое метапрограммирование, но я его пока не осилил. Ожидаю, что будут разрывы разрывов.
У меня интерес к метапрограммированию угас после увлечения лиспом. Поигрался, поюзал все эти приемы... и вдруг понял, что ставлю грабли человеку читающему этот код.
Да, метапрограммирование удобно в библиотеках, в которых надо реализовать какой-то изврат, чтобы сделать их использование более-менее удобным. Но в самих программах оно только запутывает того, кто будет поддерживать код.
Именно, не нужно забывать, что "мета"-код занимает лишь малую часть приложения и нужен довольно редко (@bormand верно подметил: в основном, в библиотеках). При использовании с умом он может сэкономить много букв, но дорабатывать и чинить такой код сложнее. За всё нужно платить.
Подумайте о своих коллегах, которые будут ночью, просрочив дедлайны, допивая десятую чашку кофе коммитить хотфиксы (сам был в такой ситуации). Используйте сложные возможности языка в меру. Пишите максимально понятный код. Хорошенько тестируйте то, что написали. Пожалуйста...
IDE не надо. Пишу в sublime text 2, собираю из него же.
>> Если интересно именно метапрограммирование и функциональность
Только функциональность интересует.
Правда займусь хаскелом, тем более компилятор есть и он кроссплатформенный. Да и sublime text подсвечивает.
Буду благодарен если подкинете материалов для плавного изучения с нуля. Желательно что-то попроще трудов Кнута.
не факт
Неужели вы? Моё почтение. :)
>просветлённый
[Недописал коммент.]
Тогда зачем пошел Хаскель учить, спрашивается? Кроме факториалов на нем ничего не считают. Полезная функциональность отсутствует. Scala и то функционально полезнее.
> функциональщина интересует
fxd
Ваш пост огорчает Столлмана.
Тем не менее Столлман давно уже ничего не разрабатывает.
Но даже спустя довольно многое время, если человек приходил и говорил, что он насрал и предлагал на это посмотреть. Его люто бешенно минусовали. Также минусовали, когда ОП предлагал посмотреть на любую синтетику или не говнокод. Особо остервенелые возмущались, когда С постили в раздел С++. Такое просто не могли простить не при каких обстоятельствах, врываясь в тред и возмщенно крича: "Где здесь С++, %nickname%?"
Сегодня говнокод уже не торт. Здесь постят код на разных языках и показывают на какахи в проектировании самого языка при этом нарушают все правила что только можно, в том числе постят синтетику без говнокода. И вы понимаете, их плюсуют! Со всей ответственностью старожила уютненького, стоявшего у истоков, заявляю: Это не здоровая канитель, господа.
На ресурсе всегда был небольшой процент долбоёбов.
Отличить одних от других - проблематично. Долбоёбы они как сорта гумна для нормального человека неотличимы по виду и запаху.
>Со всей ответственностью старожила уютненького
И без подтверждений своих слов ты не старожил, и даже не простой хуй, ты просто Гумно.
>Ньюфаги конечно этого не знают.
>старожила уютненького
А-а-а. Не смеши меня.
Рассказать историю говнокода? События могу иметь не верный порядок, но было примерно так:
Сначала можно было постить говнокоды и комменты от гуеста, притом указывать ник прямо как на борде прямо при вводе поста\комента. Вроде даже и капчи не было. (На сколько я помню её ввели не для защиты от спам ботов, а для защиты от долбоёбов о_О много позже). И внимание: ник по дифолту был указан в поле ввода не гуест, а Говногость. Минусовать и плюсовать можно было даже гуестам, при том как топики, так и коменты (на +-1).
Если говнокод уходил в минуса (порога не помню, но -1 помоему было достаточно ), то появлялась расстроенная мусорка над говнокодом и отсчитывала дату(время в часах если день последний) до удаления (две недели - день (точнее период не скажу, запамятовал)). Возможно не помню, тк этот период менялся.
если случается говно - так рахитектурное, которое и на 10 страницах не уместить
вот и остается синтетику рассматривать
я тут обнаружил, что знаком лично с человеком из первого полтинника - тесен мир:)
а ботов заводит у нас только тарас - причинять справедливость, если кто опрометчив к его божественным языкам
но он молод, горяч и из купчино, так что придется понять и простить
> мои не учатся
так ведь надо учить, если есть возможность и полномочия
С Интернета можно. С его просторов.
Элсо мои не учатся. Пишут также покакивая. :(
ШОК!! Раскрыта тайна века! Страйко == Абу. ЧИТАТЬ ДАЛЕЕ>>>
но был быстро поставлен на место http://govnokod.ru/7736#comment105183
и другой чудак Макса Прохорова форсил, а потом обосрался перед всем говнокодом.
И ты повторяешь ту же ошибку. Ты старые треды забудь. Говнокод - это не геймдев, это не двач, таких "олдфагов" как ты тут презирают.
Говно со скольки лет употребляешь в пищу?
>По истории долбоёбовм не спрашивайте, я за ними не следил
Я тебе объясняю - и в прежние времена хватало пользователей примечательных своими занудством и тупостью, похожих на тебя.
Посему сказать наверняка сколько залетных мудаков тут кукарекало решительно нельзя.
Да и никому это нахер не надо - помнить когда тут зарегался очередной школьник.
> а для защиты от долбоёбов о_О много позже
Неправда. Твои ж посты капча пропускает.
а) зайти под своим самым старым id и написать пруфпост
б) выложить сохраненный тред со старым дизайном.
Есть еще третий способ, с которым ты будешь признан олдфагом:
в) сфоткаться поедающим говно на фоне гк, с супом:
"Я, Гумно Лиспович, находясь в здравом уме и твердой памяти, торжественно заявляю, что я олдфаг".
Но сходство поразительно!
(И не спрашивайте меня, зачем я их сохранял. Хотя, на самом деле всё просто. Я хотел применить эти секретные технологии для обфускации ПХПшного кода.)
[заговор]Чтобы в будущем получить статус олдфага.[/заговор]
Достаточно посмотреть первые посты, в которых дробные оценки и говны от гостей. Даже такой ньюфажина как я об этом знаю. (Хотя до этого момента я думал, что говнокоды от гостей это баг возникший при давнишней перезаливке базы).
> в том числе постят синтетику без говнокода
Годная синтетика стоит десятка индусских кодов.