
В очередной раз пытаясь повторить английскую грамматику, я поймал себя на мысли, что постоянно забываю элементарные правила из одной строчки, при том что код большой программы запоминаю легко и без особого труда. Скорее всего то же самое у многих программистом, профессиональная деформация и все такое, однако почему бы не воспользоваться таким простым способом запомнить все эти сложные правила английского просто записав их с помощью программного кода?
Поэтому у меня возникла идея создать открытый проект на github’e code-for-learning-languages, в котором любой может добавлять свои мнемонические правила на своих языках программирования для любого естественного языка. По собственному опыту, именно написания собственного "кода" наиболее полезно для запоминания грамматики естественного языка.
Внимание: это экспериментальный проект (даже скорее идея проекта), не уверен, что для любого программиста такой способ запоминания грамматики будет оптимальным (и вообще раздел ненормальное программирование поставлен не просто так 🙂 ). В общем, стандартное open sourc’ное — идея предоставляется бесплатно и как есть, автор не несет никакой гарантии её полезности и не возвращает потраченное на неё время. 🙂
Давайте посмотрим, как это работает (кода будет на Java, так как Си-подобный синтаксис знает почти каждый программист), буду благодарен pull request’ам на других языках.
Запишем правила для всех прошлых времен.
switch (tenseForms) { case SIMPLE: return pronoun + verb + "ed"; case CONTINUOUS: return pronoun + (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + verb + "ing"; case PERFECT: return pronoun + HAD + verb + "ed"; case PERFECT_CONTINUOUS: return pronoun + HAD + BEEN + verb + "ing"; }
Правила для времен
Для начала попробуем записать алгоритм образования времен в английском языке для разных типов предложений.
Опишем утвердительные предложения для каждого времени (Positive sentence)
| Tense | Simple | Continuous | Perfect | Perfect Continuous |
|---|---|---|---|---|
| Past | pronoun + verb + "ed" |
pronoun + (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + verb + "ing" |
pronoun + HAD + verb + "ed" |
pronoun + HAD + BEEN + verb + "ing" |
| Present | pronoun + verb + (pronoun == HE_SHE_IT ? "s" : "") |
pronoun + (pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE) + verb + "ing" |
pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + verb + "ed" |
pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + BEEN + verb + "ing" |
| Future | pronoun + WILL + verb |
pronoun + WILL + BE + verb + "ing" |
pronoun + WILL + HAVE + verb + "ed" |
pronoun + WILL + HAVE + BEEN + verb + "ing" |
| Future In Past | pronoun + WOULD + BE + verb + "ing" |
pronoun + WOULD + BE + verb + "ing" |
pronoun + WOULD + HAVE + verb + "ed" |
pronoun + WOULD + HAVE + BEEN + verb + "ing" |
Или так:
Прошлое:
switch (tenseForms) { case SIMPLE: return pronoun + verb + "ed"; case CONTINUOUS: return pronoun + (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + verb + "ing"; case PERFECT: return pronoun + HAD + verb + "ed"; case PERFECT_CONTINUOUS: return pronoun + HAD + BEEN + verb + "ing"; }
Настоящее
switch (tenseForms) { case SIMPLE: return pronoun + verb + (pronoun == HE_SHE_IT ? "s" : ""); case CONTINUOUS: return pronoun + (pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE) + verb + "ing"; case PERFECT: return pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + verb + "ed"; case PERFECT_CONTINUOUS: return pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + BEEN + verb + "ing"; }
Будущее:
switch (tenseForms) { case SIMPLE: return pronoun + WILL + verb; case CONTINUOUS: return pronoun + WILL + BE + verb + "ing"; case PERFECT: return pronoun + WILL + HAVE + verb + "ed"; case PERFECT_CONTINUOUS: return pronoun + WILL + HAVE + BEEN + verb + "ing"; }
Или можно записать альтернативы
Будущее
private static String buildPositiveSentence(Pronoun pronoun, String verb, TenseForms tenseForms) { return pronoun + WILL + getAuxiliary(tenseForms) + verb + getEnding(tenseForms); } private static String getEnding(TenseForms tenseForms) { if(tenseForms == SIMPLE) return ""; else return tenseForms == PERFECT ? "ed": "ing"; } private static String getAuxiliary(TenseForms tenseForms) { switch (tenseForms) { case SIMPLE: return ""; case CONTINUOUS: return BE; case PERFECT: return HAVE; } return HAVE + BEEN; }
Прошлое
private static String buildPositiveSentence(Pronoun pronoun, String verb, TenseForms tenseForms) { return pronoun + getAuxiliaryVerb(pronoun, tenseForms, true) + getBeenOrEmpty(tenseForms) + verb + getEnding(tenseForms, true); } private static String getAuxiliaryVerb(Pronoun pronoun, TenseForms tenseForms, boolean isPositive) { switch (tenseForms) { case SIMPLE: return isPositive ? "" : DID; case CONTINUOUS: return pronoun == I || pronoun == HE_SHE_IT? WAS: WERE; } return HAD; } private static String getEnding(TenseForms tenseForms, boolean isPositive) { if(tenseForms == SIMPLE) return isPositive? "ed" : ""; else return tenseForms == PERFECT ? "ed": "ing"; } private static String getBeenOrEmpty(TenseForms tenseForms) { return tenseForms == PERFECT_CONTINUOUS ? BEEN: ""; }
Настоящее
private static String buildPositiveSentence(Pronoun pronoun, String verb, TenseForms tenseForms) { return pronoun + getAuxiliaryVerb(pronoun, tenseForms) + getBeenOrEmpty(tenseForms) + verb + getEnding(pronoun, tenseForms, true); } private static String getAuxiliaryVerb(Pronoun pronoun, TenseForms tenseForms) { switch (tenseForms) { case SIMPLE: return pronoun == HE_SHE_IT ? DOES : DO; case CONTINUOUS: return pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE; } return pronoun == HE_SHE_IT ? HAS: HAVE; } private static String getEnding(Pronoun pronoun, TenseForms tenseForms, boolean isPositive) { if(tenseForms == SIMPLE) return isPositive && pronoun == HE_SHE_IT ? "s" : ""; else return tenseForms == PERFECT ? "ed": "ing"; } private static String getBeenOrEmpty(TenseForms tenseForms) { return tenseForms == PERFECT_CONTINUOUS ? BEEN: ""; }
Другие варианты см. в github’e
Опишем отрицательные предложения для каждого времени (Negative sentence)
| Tense | Simple | Continuous | Perfect | Perfect Continuous |
|---|---|---|---|---|
| Past | pronoun + DID +"not " + verb |
pronoun + (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + "not " + verb + "ing" |
pronoun + HAD + "not " + verb + "ed" |
pronoun + HAD + "not " + BEEN + verb + "ing" |
| Present | pronoun + (pronoun == HE_SHE_IT ? DOES : DO) + "not " + verb |
pronoun + (pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE) + "not " + verb + "ing" |
pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + "not " + verb + "ed" |
pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + "not " + BEEN + verb + "ing" |
| Future | pronoun + WILL + "not " + verb |
pronoun + WILL + "not " + BE + verb + "ing" |
pronoun + WILL + "not " + HAVE + verb + "ed" |
pronoun + WILL + "not " + HAVE + BEEN + verb + "ing" |
Другие варианты см. в github’e
Вопросы (Questions)
| Tense | Simple | Continuous | Perfect | Perfect Continuous |
|---|---|---|---|---|
| Past | DID + pronoun + verb + "?" |
(pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + pronoun + verb + "ing?" |
HAD + pronoun + verb + "ed?" |
HAD + pronoun + BEEN + verb + "ing?" |
| Present | (pronoun == HE_SHE_IT ? DOES : DO) + pronoun + verb + "?" |
(pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE) + pronoun + verb + "ing?" |
(pronoun == HE_SHE_IT ? HAS: HAVE) + pronoun + verb + "ed?" |
(pronoun == HE_SHE_IT ? HAS: HAVE) + pronoun + BEEN + verb + "ing?" |
| Future | WILL + pronoun + verb + "?" |
WILL + pronoun + BE + verb + "ing?" |
WILL + pronoun + HAVE + verb + "ed?" |
WILL + pronoun + HAVE + BEEN + verb + "ing?" |
Другие варианты записи, см. в github’e
Пассивный залог (Passive)
| Tense | Simple | Continuous | Perfect |
|---|---|---|---|
| Past | pronoun + (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + verb + "ed" |
pronoun + (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + BEING + verb + "ed" |
pronoun + HAD + BEEN + verb + "ed" |
| Present | pronoun + (pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE) + verb + "ed" |
pronoun + (pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE) + BEING + verb + "ed" |
pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + BEEN + verb + "ed" |
| Future | pronoun + WILL + BE + verb + "ed" |
NULL | pronoun + WILL + HAVE + BEEN + verb + "ed" |
Другие варианты записи, см. в github’e
Будущее в прошлом
Используется чтобы в речи, описывающей прошлое время, говорить о будущем.
Запишем правило для утвердительных предложений.
switch (tenseForms) { case SIMPLE: return pronoun + WOULD + verb; case CONTINUOUS: return pronoun + WOULD + BE + verb + "ing"; case PERFECT: return pronoun + WOULD + HAVE + verb + "ed"; case PERFECT_CONTINUOUS: return pronoun + WOULD + HAVE + BEEN + verb + "ing"; }
Другие варианты записи, см. в github’e
Условные предложения
1 тип: реальное условие в настоящем или будущем времени,
глагол в главном предложении — в будущем времени
глагол в придаточном – в настоящем
if(condition == REAL && (tense == PRESENT || tense == FUTURE)) { verdInMainStatement = convertToFuture(verdInMainStatement); verdInSecondStatement = convertToPresent(verdInSecondStatement ); }
2 тип: нереальное условие в настоящем или будущем времени,
if(condition == UNREAL && (tense == PRESENT || tense == FUTURE)) { verdInMainStatement = SHOULD + verdInMainStatement; verdInSecondStatement = verdInSecondStatement.equals("be")? WERE: (verdInSecondStatement + "ed"); }
3 тип: нереальное условие в прошлом времени:
if(condition == UNREAL && tense == PAST) { verdInMainStatement = SHOULD + (pronoun == HE_SHE_IT ? HAS: HAVE) + verdInMainStatement + "ed"; verdInSecondStatement = HAD + verdInSecondStatement + "ed"; }
Или запишем все условия в одном коде:
if(condition == REAL) { if(tense == PRESENT || tense == FUTURE) { // FirstCondition verdInMainStatement = convertToFuture(verdInMainStatement); verdInSecondStatement = convertToPresent(verdInSecondStatement); } else { throw new IllegalStateException(); // Condition isn't exist } } else if(condition == UNREAL) { if(tense == PRESENT || tense == FUTURE) { // SecondCondition verdInMainStatement = SHOULD + verdInMainStatement; verdInSecondStatement = verdInSecondStatement.equals("be")? WERE: (verdInSecondStatement + "ed"); } else { // ThirdCondition verdInMainStatement = SHOULD + (pronoun == HE_SHE_IT ? HAS: HAVE) + verdInMainStatement + "ed"; verdInSecondStatement = HAD + verdInSecondStatement + "ed"; } } else { throw new IllegalStateException(); // Condition isn't exist }
Другие варианты записи, см. в github’e
Вот и все с кратким описанием проекта (точнее скорее идеи проекта). Удачи в изучении языков (как естественных, так и программных)!
P.S. Если интересно, буду благодарен звездам на github’e для проекта code-for-learning-languages, любым дополнениям к проекту (хоть в комментах, хоть в pull reauests), распространению информации о проекте как на русскоязычных ресурсах, так и на иностранных.
Проект экспериментальный, принимается любая критика. Если будет полезен возможно дополню другими правилами грамматики (например, формирование разных предлогов места/времени и т.п. для разных случаев).
P.P.S. Так же рекомендую посмотреть другие мои open-source проекты:
- useful-java-links — хранилище ссылок на open-source Java библиотеки (и на русском ),
- helloworlds — попытка собрать простые примеры для разных Java библиотек,
- Шпаргалки программиста — разные обучающие статьи по Java от автора,
ссылка на оригинал статьи https://habrahabr.ru/post/276021/
Добавить комментарий