История изменений
Исправление 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." ... )
и константы, куда же без них.