LINUX.ORG.RU

питонизируем си, js и иже с ними

 , ,


0

3

Когда я изобретал «Яр», я думал про синтаксис. С одной стороны, всем хорош Питон: в нём минимум лишнего. С другой, достаточно случайно задеть пробел и строчка кода втянется внутрь цикла или ветвления. Т.е. надёжность такого синтаксиса плохая. Как же скрестить коня и трепетную лань? А очень просто - нужно всего лишь поменять стиль отступов в Си-образных языках, и получится вот что:

function showTableStructure() {
  if (name.length == 0) {
    alert("Please select a table!");
    return;  }

  getTableStructure(name, { type: getCurrentObject().type }, 
   function(data) {
    buildTable(data);
    $("#results").addClass("no-crop");});}

Налицо питонячья компактность и при этом сишная надёжность. Но стало опять похоже на лисп...

★★★★★

Причём, в Яре я эту задачу так и не решил, т.к. планировал использовать стиль а-ля бейсик:

если что-то то
 тело
кне
Соответственно, вложенные конструкции закрывались бы чем-то диким, вроде
кнф кнц кне кнф
Это уже лишено элегантности и может тупо не поместиться на строчке за кодом. Я пытался изобрести комбинированные варианты типа
кнфцеф
, но это тоже диковато смотрится. Когда начал писать на го, тут же стало ясно, что питоно-подобный стиль со скобками - это правильное решение, а в Яре я тему не осилил.

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

;});}

Вот это ужаснее, чем лисп.

С другой, достаточно случайно задеть пробел и строчка кода втянется внутрь цикла или ветвления.

Поэтому в Питоне не просто отступы, а ещё и двоеточия. От случайного проблема получится такой же невалидный код, как от случайной фигурной скобки в Си.

P.S. Чисто с синтаксической точки зрения практически идеален Haskell.

monk ★★★★★ ()

K&R стиль не сильно уступает в компактности питону. Больше ничего не надо изобретать. Кстати, у скриптобратии прям чешется в этом месте. У одних отступы, у других end end end, у иных карго-культ доллара. Ни одного приличного синтаксиса кроме конечно тикля.

bread ()

;});}

Удачи с рефакторингом (особенно с изменением уровня вложености).

Хотя, с автоформаттерами можно довольно малозатратно конвертировать в нормальный вид и назад. Но зачем?

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

не просто отступы, а ещё и двоеточия

Случайный пример с rosettacode:

    def visit_Call(self, node):
        if isinstance(node.func, ast.Name):
            fun_name = node.func.id
            call_count = self.calls.get(fun_name, 0)
            self.calls[fun_name] = call_count + 1
        self.generic_visit(node)
Можно или внести последнюю строчку внутрь if, или вынести из него предпоследнюю, отличие будет только в whitespace. Как двоеточие тут спасёт?

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

K&R стиль не сильно уступает в компактности питону.

Довольно смелое утверждение.

if (<cond1>) {
    if (<cond2>){
        <body>
    }
}
А вот мой вариант:
if (<cond1>) {
    if (<cond2>){
        <body>}}
Данный случай экстремальный, конечно, но здесь на 40% меньше строк. В Питоне было бы также.

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

den73 ★★★★★ ()

Я в синституте занимался херней и переделывал питон, чтоб он не считал пробелы, а требовал end в конце блоков. А потом что-то похожее нашел (щас не вспомню как называется) и забил.

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

чем он лучше лиспа? С любой точки зрения практически для людей придуман лисп.

Тем, что в 90% случаях приоритеты естественным образом определяются операторами, а не скобками. Сравни

Haskell:

show $ filter ((> 0) . size) $ filter ((".txt" `isSuffixOf`) . name) files

Лисп:

(defun is-suffix-of (suf str)
  (let ((pos (mismatch str suf :from-end t)))
    (or (not pos) (= pos (- (length str) (length suf))))))

(print (remove-if-not (compose (lambda (x) (> x 0)) size) (remove-if-not (compose (lambda (x) (is-suffix-of ".txt" x)) name) files)))

В лисповой строке даже непонятно, какой аргумент в какую функцию попадает. Даже если сделать в несколько строк с отступами

(print (remove-if-not (compose (lambda (x) (> x 0)) 
                               size)
                      (remove-if-not (compose (lambda (x) (is-suffix-of ".txt" x)) 
                                              name) 
                                     files)))
всё равно читается сложнее. А если преобразователей в конвейере не 2, а 6-7, то лисповая строка становится вообще нечитаемой и её приходится разбивать на вспомогательные функции.

monk ★★★★★ ()

И что вы вообще дое..лись до этой «компактности». Главное читаемость, а не «всевкучу зато компактно». в том же Си вон вообще можно все одной строкой, компактно же, херли.

Любой современный редактор тебе сейчас сам блок нарисует и курсор в нужное место поставит. Ну это если ты не любитель в notepad.exe код поправлять.

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

Можно или внести последнюю строчку внутрь if, или вынести из него предпоследнюю, отличие будет только в whitespace.

Для этого недостаточно «случайно задеть пробел». Также можно сказать, что в

(defun visit (self none)
  (when (isinstance (func node) (name ast))
    (setf fun-name (id (func node)))
    (setf call-count (get (calls self) fun-name 0))
    (setf (gethash fun-name gethash (calls self)) (+ call-count 1))
  (generic-visit self node)))
Можно или внести последнюю строчку внутрь if, или вынести из него предпоследнюю, отличие будет только в положении одной скобки в конце строки. И не заметить лишнюю/недостающую скобку сложнее, чем отступ на 4 пробела.

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

В смысле, не будет? Либо конструкции лиспа приходится делать более простыми, либо при равной сложности конструкций лисповые будет намного сложнее читать. От объёма кода это утверждение не зависит.

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

Ага, я заметил, что когда сам код пишешь, то незавсит. Лишп, кста, довольно легко читается, если с ним долго работаешь. Я правда сильно много юзал AutoLisp, а не CL или что-то другое

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

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

Другое дело, что синтаксис Haskell очень сильно привязан к его же семантике: все функции имеют только один аргумент, все функции и последовательности ленивые, в языке есть тайпклассы и выбор тела функции определяется в том числе типом результата. Если выкинуть хоть один пункт, пользоваться им становится уже не так удобно.

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

Для этого нужно сделать несколько согласованных действий на разных строчках. Сложно сделать это случайно. А вставить-убрать отступ случайно довольно легко. Вплоть до того, что чел может занести таким путём очередной heartbleed, и потом его нельзя будет привлечь.

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

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

anonymous ()

Налицо минусы обоих подходов. Вот у Vala/Genie правильно было сделано, сменный синтаксис, полтора изменения, зато все ощущения менялись.

Ну и традиционно пожелаю заняться делом.

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

Понятно, что в чужих проектах я буду использовать уже сложившийся стиль. А в своих буду использовать этот.

Хорошо, что скобочки позволяют легко отформатировать любой рак.

bread ()

Прочитал не просто про диагонали а до слова Яр.

Не я сказал, сказал шибко более умный тип - основная беда пистона, это транспорт скрипта в условиях разделителя в виде вайтспейсов и переносов строк.

Слишком много прокси явно или неявно тримают эти конструкции, а выполнить eval на том конце таки охота. Поэтом миром таки правит js.

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

Ты не понял мысль, ну и ладно.

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

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

Для этого нужно сделать несколько согласованных действий на разных строчках.

Многие IDE автоматически добавляют закрывающие скобки до конца defun. Например, https://www.emacswiki.org/emacs/UniversialCloseParen. Поэтому, чтобы получить пример из моей цитаты (в нём ошибка), достаточно пропустить одну скобку, закрывающую when.

В Emacs меня спасает только пометить всё + авто-отступ. Но для этого авто-отступ должен всегда правильно угадывать семантику (в зависимости от контекста следующая строка должна выравниваться или по позиции аргумента или со сдвигом на два пробела). Если угадывает не всегда, то после каждого авто-отступа приходится вручную ровнять.

А без глобального авто-отступа пропустить одну скобку гораздо легче, чем отступ в 4 пробела.

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

Не я сказал, сказал шибко более умный тип - основная беда пистона, это транспорт скрипта в условиях разделителя в виде вайтспейсов и переносов строк.

Транспортировать надо как любой бинарник.

Поэтом миром таки правит js.

Не поэтому. А исключительно из-за поддержки в браузерах.

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

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

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

Я, наверное, забыл сказать о том, что отступы должны быть значимыми, т.е. некий инструмент должен проверять их перед компиляцией.

А это возможно? Вот, например,

(aaaa xxx
  (bbb ccc))
(ddd yyy
     (bbb ccc))
(eee (zzz kkk)
    (fff)
  (bbb ccc))

Здесь отступы правильные или нет?

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

Я говорю очевидные, как мне кажется, вещи, не требующие никакой статистики. Любой экран маленький. Слишком жирно, когда одна фигурная скобка занимает целую строчку. Приходится больше листать и в целом читать код становится труднее. Значит, запихивая несколько фигурных скобок на строку, где уже что-то есть, делаем текст более комфортным для работы с ним. Структура вложенности кода и так видна по отступам, а скобки - это некий бит чётности, который делает передачу инфы надёжной. В отличие от Питона, у которого только отступы. И главное, мы не можем выбирать мейнстрим языки. У каждого из них синтаксис фиксирован.

Ну всё это очевидно абсолютно, поэтому тут дискутировать не о чем, и статистика никакая не нужна. Можешь считать это субъективщиной, оспаривать и прочее. Для меня это просто руководство к действию, т.к. очевидный прирост производительности труда. Я поделился этим с ЛОРом, но я не буду это защищать с пеной у рта. Не нравится - не пользуйся :)

Максимум, что я сделал - это расписал весь ход мысли подробно (теперь). Раньше думал, что все сразу догадаются.

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

Можно или внести последнюю строчку внутрь if, или вынести из него предпоследнюю, отличие будет только в whitespace. Как двоеточие тут спасёт?

А как тут спасут скобочки?

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

очевидные, как мне кажется

Тебе кажется.

Я поделился этим с ЛОРом, но я не буду это защищать с пеной у рта.

расписал весь ход мысли подробно (теперь).

Правильно делаешь, я считаю.

anonymous ()

Лучше перенести эти скобочки влево чтобы глаза не мозолили. Можно даже в редакторе вправо проскроллить на 8 символов.

        function showTableStructure() 
{         if (name.length == 0) 
{           alert
(             "Please select a table!"
);          return
;}
          getTableStructure
(           name
,           { type: getCurrentObject().type }
,           function(data)
{             buildTable(data)
;             $("#results").addClass("no-crop")
;});}
NeXTSTEP ★★ ()
Ответ на: комментарий от monk

Какой смысл писать (compose (lambda ...? Более идиоматичный код будет такой:

(defun is-suffix-of (suf str)
  (let ((strlen (length str))
        (suflen (length suf)))
    (and (>= strlen suflen)
         (string= suf str :start2 (- strlen suflen)))))

(print (remove-if (lambda (file)
                    (or (zerop (size file))
                        (not (is-suffix-of ".txt" (name file)))))
                  files))

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

Хрестоматийно на лиспе вот так писать

(defun is-suffix-of 
(suf str
)(let 
((strlen 
(length str
))(suflen 
(length suf
)))(and 
(>= strlen suflen
)(string= suf str :start2 
(- strlen suflen
)))))(print 
(remove-if 
(lambda 
(file
)(or 
(zerop 
(size file
))(not 
(is-suffix-of ".txt" 
(name file
)))))files
))


Сразу все понятно. Просто как бейсик
anonymous ()
Ответ на: комментарий от bvn13

Можно всё. Только предлагаемое мной не требует вообще никаких инструментов - можно делать и руками, просто будет менее надёжно. А вкорячивать в питон скобки из Си - это нужно менять весь стек инструментов.

den73 ★★★★★ ()