LINUX.ORG.RU

Отступы или скобочки? - Да!

 , , , ,


2

1

Конвертер синтаксиса, который заканчивает главный холивар

«Может, в следующий раз вы посмотрите дважды - и не станете судить о книге по обложке» - Зекора

Спор «скобочки или отступы» старше, чем некоторые из его участников. У этого спора нет судьи и нет призового фонда, но есть ветераны и есть потерянные души, которые однажды написали end в Питоне и с тех пор не могут остановиться. Выиграть этот спор невозможно: стороны спорят о вкусах, а не о свойствах. Поэтому предлагаю - давайте закончим этот спор не победой, а разоружением.

Я написал маленькую утилиту, которая переводит исходный код Python между тремя синтаксисами: классические отступы, C-подобные фигурные скобки, S-выражения в духе Лиспа. Один и тот же quicksort, три вида:

def quicksort(items):
    if len(items) <= 1:
        return items
    pivot, *rest = items
    lo = [x for x in rest if x < pivot]
    hi = [x for x in rest if x >= pivot]
    return quicksort(lo) + [pivot] + quicksort(hi)
def quicksort(items) {
    if len(items) <= 1 {
        return items;
    }
    pivot, *rest = items;
    lo = [x for x in rest if x < pivot];
    hi = [x for x in rest if x >= pivot];
    return quicksort(lo) + [pivot] + quicksort(hi);
}
(defn quicksort (items)
  (if (<= (len items) 1) (return items))
  (set! '(pivot (* rest)) items)
  (set! lo (list-comp x (for [x in rest]) (when (< x pivot))))
  (set! hi (list-comp x (for [x in rest]) (when (>= x pivot))))
  (return (+ (+ (quicksort lo) [pivot]) (quicksort hi))))

Код тот же, семантика та же, а шкуры - три. И это не «примерно то же самое»: замкнутый цикл py -> шкура -> py даёт AST, структурно идентичный оригиналу - сравнение на уровне ast.dump. Как это проверяется на 38 модулях стандартной библиотеки и на самом конвертере, расскажу ниже.

Зачем это нужно (спойлер: не нужно, и в этом смысл)

«Вечный хаос - это же шоколадный дождь, ребят! Шо-ко-лад-ный дождь!» - Пинки Пай

На вопрос «зачем» отвечу сразу: чтобы перестать спорить. Сторонник скобочек может читать любой проект в своих скобочках, сторонник отступов - в своих отступах, а любители Лиспа наконец получат повод объяснить всем про S-выражения на материале, который все и так знают.

Есть и утилитарные применения, которые возможны скорее теоретически, чем практически, но всё же я их перечислю:

  • код-ревью в шкуре, удобной ревьюверу;
  • обучение: синтаксис - одежда, семантика - тело;
  • миграция мышления между языковыми семьями;
  • и главное - холивар-вечеринка у вас в комментариях. Пристегнитесь.

Как этим пользоваться

«Она была под буквой «Э»!» - Пинки Пай, нашла справочник

as lisp foo.py            # Python -> S-выражения
as brace foo.py -o foo.cpy
as py foo.lpy             # обратно
cat foo.py | as brace - --from py

Расширение само задаёт направление: .py, .cpy, .lpy; --from переопределяет. Ставится через pip install like-a.

Да, утилита называется as - по ключевому слову Python, которое всем известно из import json as j. Командная строка читается как английская фраза: as lisp - «как лисп». На PyPI имя as запрещено (ключевые слова Python регистрировать не разрешают), поэтому пакет живёт под именем like-a - like a boss lisp.

(Пользователям GNU binutils: я знаю про ассемблер. Двухбуквенное пространство имён было слишком лакомым. Если ~/.local/bin в вашем PATH стоит раньше /usr/bin - alias для сборки C. Или предложите ассемблеру переехать: трёхбуквенное сокращение ему подходит больше, к слову.)

Два слоя: где нужны токены, а где - дерево

«Голова у него - пони, а тело - из всякого прочего» - Чирили, про драконеквуса

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

Отступы <-> скобки - перекладка строк, а не структуры. Блочная граница уже известна лексеру: tokenize стандартной библиотеки выдаёт пары INDENT/DEDENT, остаётся дописать { на INDENT и } на DEDENT. Конвертация идёт на уровне токенов, без построения дерева. Поэтому в этой паре выживают комментарии, пустые строки и форматирование: мы переписываем границы блоков, не трогая остальной текст.

Отступы <-> S-выражения - перестройка дерева. a + b * c превращается в (+ a (* b c)), и чтобы это сделать, нужно знать приоритеты операций. Можно написать свой Pratt-парсер… а можно не писать: модуль ast уже давно распарсил всё правильно, пройдя через все граничные случаи, накопленные экосистемой Python за долгие годы. Конвертер просто обходит готовое дерево и печатает его в новой нотации. Обратный путь делает маленький ридер S-выражений, который строит AST напрямую.

Отсюда бесплатный вывод, который лично меня радует: S-выражения - это не «другой синтаксис», это то же дерево, но в текстовой форме. Что, как известно, никого не удивляет в Лиспе.

Боевые истории: что ломалось на stdlib

«Хаос - это чудесно, чудесно!» - Дискорд

Quicksort из вступления - мой код, написанный для иллюстрации (для красоты). С чужим кодом всё интереснее: его писали 35 лет, не оглядываясь на мой конвертер. Все примеры ниже - реальные баги, найденные, пока я добивался работоспособности замкнутого цикла на 38 модулях стандартной библиотеки. CPython - лучший фаззер синтаксиса. Комьюнити находило такие темные углы, куда нормальный человек не заглядывает.

Set-литерал в заголовке. В enum.py (строка 1057) встречается:

if target not in {
        None,
        None.__new__,
        object.__new__,
        Enum.__new__,
    }:
    __new__ = target

Многострочный set-литерал в {} коллидирует с блочными скобками - заголовок if при переводе в brace-кожу получает два конкурирующих {. Решение: заголовки, содержащие фигурные скобки, сворачиваются в одну строку.

Backslash-продолжения внутри скобок. inspect.py, строка 3248:

raise TypeError('missing a required argument: {arg!r}'. \
                format(arg=param_name)) from None

У строки-продолжения есть собственный вклад в баланс скобок (тут - открытая ( от TypeError(). Наивная буферизация продолжений теряет этот вклад, и баланс уезжает в минус на четыре сотни строк. Урок: у каждой строки есть delta, и она применяется всегда - даже когда строка уходит в буфер.

Пользовательская функция quote. В shlex.py (строка 323) живёт функция def quote(s). В lpy-шкуре кортежи печатаются как '(элементы...) - спец-форма quote. Вызов (quote s) оказался на глаз неотличим от кортежа из одного элемента… нет, отличим: настоящий кортеж-литерал всегда содержит список. Ридер теперь различает кортеж (quote (...)) и вызов пользовательской функции (quote x). Которая, между прочим, живёт себе в shlex и ни о чём таком даже не думает.

Строка "quote" как ключ словаря. В csv.py (строка 275) словарь {'delim': ..., 'quote': ...} при печати давал форму {("delim" x) ("quote" y)}, и ридер принимал строковый ключ "quote" за голову спец-формы. Лечение: проверять тип головы - спец-форма начинается с символа quote, а не со строки "quote". Именно для этого и существует подкласс str по имени Sym.

Замкнутый цикл как контракт

«Крест на сердце, взлететь готова - воткну кексик себе в глаз!» - Пинки Пай, клятва

«Без потерь» - слово, которое любят писать в README. Вот определение, которое проверяет машина:

ast.dump(ast.parse(src)) == ast.dump(ast.parse(
    convert(convert(src, 'py', skin), skin, 'py')))

для skin из {brace, lisp} и для всех файлов корпуса.

Метрики проекта без округления: 92 теста = 13 юнит-тестов + 76 корпусных прогонов (38 файлов × 2 направления) + 2 самоприменения + 1 тест, что сконвертированный конвертер исполняется.

И вишенка на торте - самоприменение. Каждый из семи модулей пакета aslang прогоняется через оба направления: результат обязан быть AST-эквивалентным и - что приятнее - исполняемым. Где-то в тестовом прогоне есть экземпляр ридера S-выражений, который сам был напечатан принтером из AST, распаршен обратно и выполняет работу. Утилита пережила собственную конвертацию. Это тот род самореференции, ради которого стоило писать инструмент.

Чем это отличается от того, что уже было сделано

«Надо, чтобы это было процентов на двадцать круче» - Рэйнбоу Дэш

bythonHyNimas
направление-> py-> py ASTсвой языклюбое -> любое
скобочная шкура+-++
S-выражения-+ (свои)-+
гарантия круга---+ (AST-equal)
семантика Python+почтинет+ точно

bython - препроцессор: пишет скобки, исполняет отступы, одно направление. Hy - настоящий Лисп со своей семантикой и макросами, замечательный и другой: он не переводит этот ваш Python, он заменяет его. Nim просто всё равно: это отдельный язык. as занимает оставшуюся нишу: чистый синтаксический слой над неизменной семантикой Python, во все стороны, с доказуемой обратимостью.

Ограничения

«Первое правило нашей игры: никаких крыльев и никакой магии» - Дискорд

  • Комментарии в lisp-шкуре - best-effort: ast их не хранит, конвертер возвращает по номерам строк. В brace-шкуре живут как родные.
  • typing.TypeAlias-стейтменты и экзотика последней версии - пока мимо lisp-ридера.
  • Threading-макросов ->/->> сознательно нет: они делают round-trip неоднозначным, а неоднозначность ломает главный тезис.

Если зайдёт

«Верну их вам в своё время» - Дискорд, про отобранные крылья и магию

Есть направление, которое я сознательно оставил за скобками: обратный ход - C без скобок, с отступами. Почему не сейчас: в Python скобки избыточны - лексер и так знает границы блоков, потому конвертация и живёт на уровне токенов. В C скобки несущие: enum {A, B}, инициализаторы массивов и структур, GNU-выражения ({ ... }) - чтобы убрать только блочные и не тронуть литеральные, нужен полноценный парсер (libclang или tree-sitter), а не перекладка токенов. И замкнутый цикл выйдет только AST-уровневый, не побайтовый.

Частичный ответ уже существует - Nim: пишешь с отступами, на выходе C. Но Nim - отдельный язык со своей стандартной библиотекой, на нём пишут с нуля. Шкура для C - про другое: читать существующий код в удобном виде, не переписывая. И спрос двусторонний: многим нравится всё в Nim, кроме питон-стиля - а скобочной формы у Nim нет, в его грамматике скобки заняты сетами и прагмами.

Nim-программистам привет: скобки под данные, а не под блоки - это красота дизайна, а не упущение. И шкура ничего бы у Nim не отбирала: канон остаётся за отступами, просто народ с C-привычками принёс бы код, который всегда можно было бы привести к каноническому виду. Так что работы в разы больше, но интерес к Nim доказывает, что это может быть востребовано - если зайдёт, займусь.

Попробуйте на чем-то своём

«Ура.» [тихо] - Флаттершай

as lisp ваш_файл.py

Прогоните свой самый нелюбимый модуль через обе шкуры. Самые красивые и самые страшные результаты несите в комментарии, лучшее буду размещать в README. А если после этого вам всё ещё хочется поспорить о скобочках и отступах - ну, вы поняли: спорить больше не о чем.


Ссылки: GitHub | GitFlic | PyPI | таблица аналогов и form reference - в README.



Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 1)

Всем привет!
Я не пропал! Появляюсь и читаю нерегулярно, в дебатах участвовать совершенно некогда, но общению рад!

wirewalk
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Как-то криво сформулировал! Надо вот так: «Скобочка должна быть единственным символом в строке!»
Так же блоки проще видеть )

GAMer ★★★★★
()
Ответ на: комментарий от GAMer

Нет ты криво! Надо вот эдак: «Скобочка должна быть единственным символом в строке, не считая пробельных символов отступа, за исключением случаев когда скобочка стоит после ключевого слова!»
Иначе получится вот это

for(int x = 0; x < 10; ++x)
{
   if(arr[x] == 0)
{
  break;
}else
{
  printf("%d\n",arr[x]);
}
}

Ой, кажется из зала кто-то крикнул «табы». Пните его на 4 стула к двери! Да что вы делаете, на 4, а не на 8!

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)
Ответ на: комментарий от LINUX-ORG-RU

не считая пробельных символов отступа!

В тред вломились любители whitespace, но на них никто не обратил внимания -_-

GAMer ★★★★★
()
Ответ на: комментарий от GAMer

Скобочка должна быть единственным символом в строке

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

bread
()

Ты хоть читал что тебе бредогенератор сгенерировал?

«гарантия круга»

firkax ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Не хотел никого обидеть. Автор сам написал, что сделал эталон эталонного не нужно. Такую тему не хочется серьёзно комментировать. Ну вот у кого будет столько свободного времени?

bbc69
()
Ответ на: комментарий от bbc69

Ну вот у кого будет столько свободного времени?

У тебя и у меня, мы же тут =). А так, как я понял это аналог astyle, только по другому и для другого, а оный в своё время был стандарт продакшоновый, прежде чем отправить патч им приводили код к требуемому виду автоматически, пишешь в своём авторском стиле, а шлёшь в требуемом формате. Меня питон тоже интересует, так как ненужный тут именно он подстрекательство к холивару, но любое проявление созидательного творчества это хорошо. Вопрос нужности же, лежит в плоскости интересов конкретного лица.

Всё я закончил душнить ^.^!

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от Bad_ptr

Вы нейросеть?

Я вечно куда-то бегущий и вечно опаздывающий человек, с толкающимися в очереди мыслями и планами, от этого косноязычный и не очень внимательный.
На «нейросеть» не обижаюсь, но действительности это не соответствует. С ними я общался, и помногу, ну и, на мой взгляд, вообще не похож.

wirewalk
() автор топика
Ответ на: комментарий от CrX

всё ещё празднует 1 сентября новый год

Вариант, кстати.

wirewalk
() автор топика
Ответ на: комментарий от bbc69

первое сентября не прошло даром.

Оно вообще еще не прошло.

wirewalk
() автор топика

(return items)

Што

set!

Зочем

(list-comp x (for [x in rest]) (when (< x pivot))

Так ведь for — это и есть list comprehension.

Nervous ★★★★★
()
Ответ на: комментарий от Nervous

Шкура - не идиоматичный Лисп, а честный перевод: return и set! отражают императивную семантику исходника, а list-comp несёт все три части comprehension (выражение, for-условие, when-фильтр), for тут не цикл, а итератор. Написать хвостовую рекурсию или loop это значит изменить дерево, а контракт требует ast.dump до == после. Это переводчик, а не учитель стиля, поэтому идиоматичный Лисп сломал бы ast.

wirewalk
() автор топика

(Пользователям GNU binutils: я знаю про ассемблер. Двухбуквенное пространство имён было слишком лакомым. Если ~/.local/bin в вашем PATH стоит раньше /usr/bin - alias для сборки C. Или предложите ассемблеру переехать: трёхбуквенное сокращение ему подходит больше, к слову.)

Охренительный выстрел в ногу, браво!

mittorn ★★★★★
()
+++++++++++>+>>>>++++++++++++++++++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-<-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<-]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<+>>[-]]<<<<<<<]>>>>>[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++++++++++++++++++++++++++++++++++++++++++++++.[-]<<<<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<[-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]
dataman ★★★★★
()
Ответ на: комментарий от dataman
>+++++[<++++>-]<--[>>+++[<++++>-]<<-]>>+++[<--->-]<+.------------------.++++++++
++++++++++.-------------------.+++++++++++++++++++.>>++++[<+++++>-]<----[>>+++[<
++++>-]<<-]>>+++[<--->-]<+.>>+++[<+++>-]<--[>>++[<+++>-]<-<-]>---.>>+++++[<++++>
-]<--[>>+++[<++++>-]<<-]>>+++[<--->-]<+.-----------------.+++++++++++++++++.----
--------------.+++++++++++++++++++.>>++++[<++++>-]<--[>>++++[<+++>-]<--<-]>>+++[
<---->-]<+++.>>+++++[<++++>-]<--[>>+++[<++++>-]<<-]>>+++[<--->-]<+.-------------
-------.++++++++++++++++++++.-------------------.+++++++++++++++++++.>>++++[<+++
++>-]<----[>>+++[<++++>-]<<-]>>+++[<---->-]<+.>>+++++[<++++>-]<--[>>+++[<++++>-]
<<-]>>+++[<--->-]<+.>>++++[<+++++>-]<----[>>+++[<++++>-]<<-]>>++[<--->-]<+.>>+++
++[<++++>-]<--[>>+++[<++++>-]<<-]>>+++[<--->-]<+.>>++++[<+++++>-]<----[>>+++[<++
++>-]<<-]>>+++[<--->-]<+.>>+++[<+++>-]<--[>>++[<+++>-]<-<-]>---.>>+++++[<++++>-]
<--[>>+++[<++++>-]<<-]>>+++[<--->-]<++.>>++++[<++++>-]<--[>>++++[<+++>-]<--<-]>>
+++[<---->-]<+++.>>+++++[<++++>-]<--[>>+++[<++++>-]<<-]>>+++[<--->-]<+.>>++++[<+
++++>-]<----[>>+++[<++++>-]<<-]>>++++[<--->-]<++.>>+++++[<++++>-]<--[>>+++[<++++
>-]<<-]>>+++[<--->-]<+.>>++++[<+++++>-]<----[>>+++[<++++>-]<<-]>>+++[<---->-]<+.
LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Ведь все самые активные пользователи сегодня пошли в первый класс.

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

VIT ★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Кстати, мне всегды бал непонятен этот момент. Конечно, у них всё-таки была школа рабочей молодёжи. А что, в 1972 году было нормально вот так, перед школой зайти к бочке и пропустить кружку?

VIT ★★★
()
Ответ на: комментарий от VIT

Они пили квас и грызли баранки. Ты о чём?
Да и причём тут год, вечерние школы очно-заочные для взрослых, и тогда были и сейчас есть.

Сама сцена фильма просто про отлынивание одного, и прятки от влюблённой женщины другого.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Пиво они пили. Там фраза в фильме «Что, рабочему человеку даже пиво нельзя после смены выпить?»

VIT ★★★
()
Ответ на: комментарий от VIT

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

LINUX-ORG-RU ★★★★★
()

Это ИИ-шница?

А, да ИИ-шница. Видно по комментарям:

py ⇄ brace: re-skin indentation blocks as curly-brace blocks

`if x {` → `if x` if this is a block header line, else None.

Вот эти вот ⇄ → ручками печатать замучаешься, а роботу пофиг и где-то стоят обычные ->, а где-то специальные.

ТС, какую ИИ/чатик/агента юзал?

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 4)
Ответ на: комментарий от peregrine

Еще остались на свете люди, которые комментарии пишут вручную? Зачем?

«Ручная работа. Такой труд отличается высокой степенью индивидуальности, внимания к деталям и уникальностью конечного продукта» (с)

Что там требуется в комментариях? Уникальность конечного продукта? Индивидуальность?

wirewalk
() автор топика
Ответ на: комментарий от wirewalk

Потому что комментарии пишутся не для ИИ, а для тебя. Они не более чем подсказка тебе, потому и понятны должны быть именно тебе. А если нейрослопить, то уже полностью, в коде написанном ИИ ты будешь разбираться ровно также как в любом другом случайном коде с репы какого-то чувака в гитхабе. Собственно это пока единственная причина, почему всех разработчиков ещё не выставили на мороз. Как только пофиксят (что ИИ будет разбираться в том коде, который написал сам любого размера, создавая себе какую-то удобную памятку влезающую в контекст и выкидывая то что туда не нужно всовывать), так и всё. Будет софт чисто ИИ писаться без участия человека вообще. На деле до этого осталось один-два шага. Для начала извлекать объявления функций (без содержимого, а только с описанием что они делают) и учить на этих данных. Если всё равно проект велик и в контекст не лезет, то делать памятки по более крупным блокам (классы, файлы, а там уже подгружать/генерировать памятку на лету по нужному файлу). Галюны упадут примерно до 0.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)

питоныч же математиком писался а не как перл лингвистом. и то на двуязычие натянули….

pfg ★★★★★
()
Ответ на: комментарий от peregrine

Потому что комментарии пишутся не для ИИ, а для тебя.

Для меня? Спасибо, не надо. Предпочитаю читать код, а не комментарии. Тогда зачем добавляю комментарии? Затем что на отсутствие комментариев регулярно жалуются. Есть люди которые предпочитают текст на естественном языке, а не на языке программирования. ИИ прекрасно справляется с задачами перевода с одного языка на другой. Лично мне нравится то, что подобным бойлерплейтом уже нет необходимости заниматься лично.

wirewalk
() автор топика
Ответ на: комментарий от wirewalk

Для меня? Спасибо, не надо.

Ну не знаю. Лично я, когда начинаю писать функцию, первым делом пишу комментарий, в котором подробно описано, что она должна делать — что на входе, что на выходе, какие побочные эффекты, по возможности со всеми граничными случаями. Это помогает не слишком растекаться мыслью в разные стороны, забывая, что конкретно требуется.

Nervous ★★★★★
()

пони-комменты в статье понравились, код не читал (но комменты в нём предпочёл бы человеческие), название «as» осуждаю.

Andrew-R ★★★★★
()
Ответ на: комментарий от Nervous

Лично я, когда начинаю писать функцию, первым делом пишу комментарий, в котором подробно описано, что она должна делать — что на входе, что на выходе, какие побочные эффекты, по возможности со всеми граничными случаями.

Хорошая практика. Не мой путь, но подход правильный. Я обычно пишу «черновики» на псевдоязыке, (может быть поэтому и отношусь к скобочкам и отступам, как к «шкурам», легко надеть - легко сменить. Собственно утилита - про это.).

wirewalk
() автор топика

Предлагаю добавить begin/end

Shadow ★★★★★
()
Ответ на: комментарий от VIT

Не знаю, что в 1972, дядя родной рассказывал, что в 50-х нормально было на «Степане Разине» на обед 2 кружки сусла (но с градусом). Он там рядом жил, говорит, знакомые ребята за несколько лет «сгорали».

Shadow ★★★★★
()

А теперь прогони через него по кругу if len(items) <= 1 { return items; } и мы посмотрим чего стоит эта твоя конвертилка.

ya-betmen ★★★★★
()
Ответ на: комментарий от Shadow

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

VIT ★★★
()
Ответ на: комментарий от ya-betmen

делаешь двойную работу

С точки зрения того, кто не отличает спецификацию от реализации — возможно.

Nervous ★★★★★
()
Ответ на: комментарий от mittorn

Охренительный выстрел в ногу, браво!

Справедливо, алиас не спасает, gcc зовёт as напрямую, минуя шелл. README поправил (в 0.1.1). Статью править пока не буду.

wirewalk
() автор топика
Ответ на: комментарий от necromant

Реквестирую Forth стиль - в реверсивном порядке.

Принято, записано.

wirewalk
() автор топика
Ответ на: комментарий от VIT

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

Shadow ★★★★★
()
Ответ на: комментарий от Shadow

Если бы Андропов был каким-то Васей из Петрозаводска, то это действительно было бы его личной заморочкой. Но поскольку он был не просто Васей, а руководителем страны, богом на земле и небожителем одновременно, его заморчка была заморочкой всех жителей одной шестой части суши. А до традиций с ржаным элем Андропову было фиолетово, он сам был создателем традиций и полагал, что имеет право указывать как жить и как не жить советскому человеку.

VIT ★★★
()
Последнее исправление: VIT (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

Если у тебя реализация отличается от спецификации то нафиг такая спецификация нужна?

Нормально делай (при необходимости внесения изменений сначала дорабатываем спецификацию, потом по ней дорабатываем кот) — нормально будет.

Nervous ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.