LINUX.ORG.RU

История изменений

Исправление byko3y, (текущая версия) :

Строк столько же, токенов столько же. В случае, если что-то незнакомое гуглить format и concat намного проще, чем «%» и «+»

Пхах, а скобочки ты не считаешь? И нет, они важны, потому что иначе их придется заменять переносами строк. Вместо лаконичного синтаксиса обладающего семантикой, в лиспе сплошные «ехали функции через скобки». Я уверен, тредик согласен с мной, что, при всем моем неуважении к питону, пример на питоне значительно чище и проще, потому что со скобкотой в лиспе получается эдак в два раза больше читаемых сущностей. Причем, исправить это нельзя, поскольку как не крути, а программа на лиспе должна состоять из этих простейших сущностей, пока это еще лисп. Выход один — написать на лиспе нелисп, который не будет подходить в качестве корма для обычных макросов, то есть, этот нелисп не будет иметь прямого соответствия из s-выражений.

do
putStr «Hello, »
putStrLn «World»

Каждый шаг — боль, каждый шаг — превозмогание, но нет «мы привыкли, нам нормально».

Тебе, чтобы написать в начале последовательности команд «do» надо превозмогать с болью?

Уже ответил выше с примером ошибки. Под капотом происходят весьма сложные вещи, и эти сложные вещи вываливаются на программиста при совершении ошибок. А ошибки совершенно точно будут. И так же с этими ошибками ты столкнешься, если попытаешься в do засунуть собственную функцию — а ты не можешь, например, вызвать из этого блока do чистую функцию без дополнительных приседаний. Да, религиозно фанатичный хаскелист скажет «что тут сложного? всё просто: do оборачивает блоки в монаду через монадические бинды, значит нужно чистые функции обернуть в return или стрелочную нотацию, а грязные функции вызывать как они есть при условии, что они являются монадой того же типа» — но это и есть «намного сложнее, чем должно быть». И это только «Hello World» — напоминаю для тех, кто уже забыл, о чем была беседа.

loop.for(«i»).from(1).to(100).for(«j»).from(1).to(100).collect(«[i,j]»)

[[i,i+99] for i in range(1,11)]
читается на порядок сложнее. И почти всегда требуют комментарий вида

Это стёб такой? Ты серьезно считаешь, что пример с list comprehension читается сложнее, чем рябь из вызовов функций? При всем моем неуважении к list comprehension... Я вообще предлагал нотацию плана:

list$
    for in in range(1, 11):
        yield [i, i+99]

Но в питоне до сих пор не научились передавать функцию аргументом.

Макросы нужны для нового синтаксиса. Приведи хоть один пример, где макрос можно заменить функцией. Разве что в том виде, как я привёл для питона (многословно и мусорно)

Легчайше. Берем тот же упомянутый выше по треду lsp-mode.el, 8000 строк, 18 макросов. Посмотрим. зачем же они «нужны», какой «новый синтаксис» они приносят:

(defmacro lsp-with-current-buffer (buffer-id &rest body) ... )
(defmacro lsp--catch (tag bodyform &rest handlers)
  "Catch TAG thrown in BODYFORM." ...)
(defmacro lsp--while-no-input (&rest body)
  "Wrap BODY in `while-no-input' and respecting `non-essential'." ...)
(defmacro lsp-save-restriction-and-excursion (&rest form) ... )
(defmacro with-lsp-workspace (workspace &rest body)
  "Helper macro for invoking BODY in WORKSPACE context." ... )
(defmacro with-lsp-workspaces (workspaces &rest body)
  "Helper macro for invoking BODY against multiple WORKSPACES."
(defmacro lsp-foreach-workspace (&rest body)
  "Execute BODY for each of the current workspaces." ... )
(defmacro when-lsp-workspace (workspace &rest body)
  "Helper macro for invoking BODY in WORKSPACE context if present." ... )
(defmacro lsp-define-conditional-key (keymap key def desc cond &rest bindings)
  "In KEYMAP, define key sequence KEY as DEF conditionally." ... )
(defmacro lsp--with-workspace-temp-buffer (workspace-root &rest body)
  "With a temp-buffer under `WORKSPACE-ROOT' and evaluate `BODY', useful to access dir-local variables." ... )
(defmacro lsp-with-filename (file &rest body)
  "Execute BODY with FILE as a context.
Need to handle the case when FILE indicates virtual buffer." ... )
(defmacro lsp-with-cached-filetrue-name (&rest body) 
  "Executes BODY caching the `file-truename' calls." ... )
(defmacro lsp--doctor (&rest checks) ... )

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

(defmacro lsp--json-serialize (params) ... )
(defmacro lsp--read-json (str) ... )
(defmacro lsp-json-read-buffer () ... )

здесь — для условной компиляции при отсутствии пакета json.

(defmacro lsp-consistency-check (package)
  `(defconst ,(intern (concat (symbol-name package)
                              "-plist-value-when-compiled"))
     (eval-when-compile lsp-use-plists)))
(defmacro lsp-make-interactive-code-action (func-name code-action-kind)
  "Define an interactive function FUNC-NAME that attempts to
execute a CODE-ACTION-KIND action." ... )

и константы, куда же без них.

Исправление byko3y, :

Строк столько же, токенов столько же. В случае, если что-то незнакомое гуглить format и concat намного проще, чем «%» и «+»

Пхах, а скобочки ты не считаешь? И нет, они важны, потому что иначе их придется заменять переносами строк. Вместо лаконичного синтаксиса обладающего семантикой, в лиспе сплошные «ехали функции через скобки». Я уверен, тредик согласен с мной, что, при всем моем неуважении к питону, пример на питоне значительно чище и проще, потому что со скобкотой в лиспе получается эдак в два раза больше читаемых сущностей. Причем, исправить это нельзя, поскольку как не крути, а программа на лиспе должна состоять из этих простейших сущностей, пока это еще лисп. Выход один — написать на лиспе нелисп, который не будет подходить в качестве корма для обычных макросов, то есть, этот нелисп не будет иметь прямого соответствия из s-выражений.

do
putStr «Hello, »
putStrLn «World»

Каждый шаг — боль, каждый шаг — превозмогание, но нет «мы привыкли, нам нормально».

Тебе, чтобы написать в начале последовательности команд «do» надо превозмогать с болью?

Уже ответил выше с примером ошибки. Под капотом происходят весьма сложные вещи, и эти сложные вещи вываливаются на программиста при совершении ошибок. А ошибки совершенно точно будут. И так же с этими ошибками ты столкнешься, если попытаешься в do засунуть собственную функцию — а ты не можешь, например, вызвать из этого блока do чистую функцию без дополнительных приседаний. Да, религиозно фанатичный хаскелист скажет «что тут сложного? всё просто: do оборачивает блоки в монаду через монадические бинды, значит нужно чистые функции обернуть в return или bind-нотацию, а грязные функции вызывать как они есть при условии, что они являются монадой того же типа» — но это и есть «намного сложнее, чем должно быть». И это только «Hello World» — напоминаю для тех, кто уже забыл, о чем была беседа.

loop.for(«i»).from(1).to(100).for(«j»).from(1).to(100).collect(«[i,j]»)

[[i,i+99] for i in range(1,11)]
читается на порядок сложнее. И почти всегда требуют комментарий вида

Это стёб такой? Ты серьезно считаешь, что пример с list comprehension читается сложнее, чем рябь из вызовов функций? При всем моем неуважении к list comprehension... Я вообще предлагал нотацию плана:

list$
    for in in range(1, 11):
        yield [i, i+99]

Но в питоне до сих пор не научились передавать функцию аргументом.

Макросы нужны для нового синтаксиса. Приведи хоть один пример, где макрос можно заменить функцией. Разве что в том виде, как я привёл для питона (многословно и мусорно)

Легчайше. Берем тот же упомянутый выше по треду lsp-mode.el, 8000 строк, 18 макросов. Посмотрим. зачем же они «нужны», какой «новый синтаксис» они приносят:

(defmacro lsp-with-current-buffer (buffer-id &rest body) ... )
(defmacro lsp--catch (tag bodyform &rest handlers)
  "Catch TAG thrown in BODYFORM." ...)
(defmacro lsp--while-no-input (&rest body)
  "Wrap BODY in `while-no-input' and respecting `non-essential'." ...)
(defmacro lsp-save-restriction-and-excursion (&rest form) ... )
(defmacro with-lsp-workspace (workspace &rest body)
  "Helper macro for invoking BODY in WORKSPACE context." ... )
(defmacro with-lsp-workspaces (workspaces &rest body)
  "Helper macro for invoking BODY against multiple WORKSPACES."
(defmacro lsp-foreach-workspace (&rest body)
  "Execute BODY for each of the current workspaces." ... )
(defmacro when-lsp-workspace (workspace &rest body)
  "Helper macro for invoking BODY in WORKSPACE context if present." ... )
(defmacro lsp-define-conditional-key (keymap key def desc cond &rest bindings)
  "In KEYMAP, define key sequence KEY as DEF conditionally." ... )
(defmacro lsp--with-workspace-temp-buffer (workspace-root &rest body)
  "With a temp-buffer under `WORKSPACE-ROOT' and evaluate `BODY', useful to access dir-local variables." ... )
(defmacro lsp-with-filename (file &rest body)
  "Execute BODY with FILE as a context.
Need to handle the case when FILE indicates virtual buffer." ... )
(defmacro lsp-with-cached-filetrue-name (&rest body) 
  "Executes BODY caching the `file-truename' calls." ... )
(defmacro lsp--doctor (&rest checks) ... )

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

(defmacro lsp--json-serialize (params) ... )
(defmacro lsp--read-json (str) ... )
(defmacro lsp-json-read-buffer () ... )

здесь — для условной компиляции при отсутствии пакета json.

(defmacro lsp-consistency-check (package)
  `(defconst ,(intern (concat (symbol-name package)
                              "-plist-value-when-compiled"))
     (eval-when-compile lsp-use-plists)))
(defmacro lsp-make-interactive-code-action (func-name code-action-kind)
  "Define an interactive function FUNC-NAME that attempts to
execute a CODE-ACTION-KIND action." ... )

и константы, куда же без них.

Исходная версия byko3y, :

Строк столько же, токенов столько же. В случае, если что-то незнакомое гуглить format и concat намного проще, чем «%» и «+»

Пхах, а скобочки ты не считаешь? И нет, они важны, потому что иначе их придется заменять переносами строк. Вместо лаконичного синтаксиса обладающего семантикой в лиспе сплошные «ехали функции через скобки». Я уверен, тредик согласен с мной, что, при всем моем неуважении к питону, пример на питоне значительно чище и проще, потому что со скобкотой в лиспе получается эдак в два раза больше читаемых сущностей. Причем, исправить это нельзя, поскольку как не крути, а программа на лиспе должна состоять из этих простейших сущностей, пока это еще лисп. Выход один — написать на лиспе нелисп, который не будет подходить в качестве корма для обычных макросов, то есть, этот нелисп не будет иметь прямого соответствия из s-выражений.

do
putStr «Hello, »
putStrLn «World»

Каждый шаг — боль, каждый шаг — превозмогание, но нет «мы привыкли, нам нормально».

Тебе, чтобы написать в начале последовательности команд «do» надо превозмогать с болью?

Уже ответил выше с примером ошибки. Под капотом происходят весьма сложные вещи, и эти сложные вещи вываливаются на программиста при совершении ошибок. А ошибки совершенно точно будут. И так же с этими ошибками ты столкнешься, если попытаешься в do засунуть собственную функцию — а ты не можешь, например, вызвать из этого блока do чистую функцию без дополнительных приседаний. Да, религиозно фанатичный хаскелист скажет «что тут сложного? всё просто: do оборачивает блоки в монаду через монадические бинды, значит нужно чистые функции обернуть в return или bind-нотацию, а грязные функции вызывать как они есть при условии, что они являются монадой того же типа» — но это и есть «намного сложнее, чем должно быть». И это только «Hello World» — напоминаю для тех, кто уже забыл, о чем была беседа.

loop.for(«i»).from(1).to(100).for(«j»).from(1).to(100).collect(«[i,j]»)

[[i,i+99] for i in range(1,11)]
читается на порядок сложнее. И почти всегда требуют комментарий вида

Это стёб такой? Ты серьезно считаешь, что пример с list comprehension читается сложнее, чем рябь из вызовов функций? При всем моем неуважении к list comprehension... Я вообще предлагал нотацию плана:

list$
    for in in range(1, 11):
        yield [i, i+99]

Но в питоне до сих пор не научились передавать функцию аргументом.

Макросы нужны для нового синтаксиса. Приведи хоть один пример, где макрос можно заменить функцией. Разве что в том виде, как я привёл для питона (многословно и мусорно)

Легчайше. Берем тот же упомянутый выше по треду lsp-mode.el, 8000 строк, 18 макросов. Посмотрим. зачем же они «нужны», какой «новый синтаксис» они приносят:

(defmacro lsp-with-current-buffer (buffer-id &rest body) ... )
(defmacro lsp--catch (tag bodyform &rest handlers)
  "Catch TAG thrown in BODYFORM." ...)
(defmacro lsp--while-no-input (&rest body)
  "Wrap BODY in `while-no-input' and respecting `non-essential'." ...)
(defmacro lsp-save-restriction-and-excursion (&rest form) ... )
(defmacro with-lsp-workspace (workspace &rest body)
  "Helper macro for invoking BODY in WORKSPACE context." ... )
(defmacro with-lsp-workspaces (workspaces &rest body)
  "Helper macro for invoking BODY against multiple WORKSPACES."
(defmacro lsp-foreach-workspace (&rest body)
  "Execute BODY for each of the current workspaces." ... )
(defmacro when-lsp-workspace (workspace &rest body)
  "Helper macro for invoking BODY in WORKSPACE context if present." ... )
(defmacro lsp-define-conditional-key (keymap key def desc cond &rest bindings)
  "In KEYMAP, define key sequence KEY as DEF conditionally." ... )
(defmacro lsp--with-workspace-temp-buffer (workspace-root &rest body)
  "With a temp-buffer under `WORKSPACE-ROOT' and evaluate `BODY', useful to access dir-local variables." ... )
(defmacro lsp-with-filename (file &rest body)
  "Execute BODY with FILE as a context.
Need to handle the case when FILE indicates virtual buffer." ... )
(defmacro lsp-with-cached-filetrue-name (&rest body) 
  "Executes BODY caching the `file-truename' calls." ... )
(defmacro lsp--doctor (&rest checks) ... )

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

(defmacro lsp--json-serialize (params) ... )
(defmacro lsp--read-json (str) ... )
(defmacro lsp-json-read-buffer () ... )

здесь — для условной компиляции при отсутствии пакета json.

(defmacro lsp-consistency-check (package)
  `(defconst ,(intern (concat (symbol-name package)
                              "-plist-value-when-compiled"))
     (eval-when-compile lsp-use-plists)))
(defmacro lsp-make-interactive-code-action (func-name code-action-kind)
  "Define an interactive function FUNC-NAME that attempts to
execute a CODE-ACTION-KIND action." ... )

и константы, куда же без них.