Может ли язык содержать мощные макросы Lisp без скобок? - PullRequest
34 голосов
/ 27 апреля 2010

Может ли язык содержать мощные макросы Lisp без скобок?

Ответы [ 17 ]

1 голос
/ 19 августа 2014

Я думаю, что это не упоминалось.

Шаблоны C ++ завершены по Тьюрингу и выполняют обработку во время компиляции.

Существует хорошо известный механизм шаблонов выражений , который допускает преобразования, не из произвольного кода, но, по крайней мере, из подмножества операторов c ++.

Итак, представьте, что у вас есть 3 вектора по 1000 элементов, и вы должны выполнить:

(A + B + C)[0] 

Вы можете захватить это дерево в шаблоне выражения и произвольно манипулировать им во время компиляции.

С этим деревом во время компиляции вы можете преобразовать выражение. Например, если это выражение означает A[0] + B[0] + C[0] для вашего домена, вы можете Избегайте нормальной обработки C ++, которая будет:

  1. Добавьте A и B, добавив 1000 элементов.
  2. Создайте временный результат для результата и добавьте 1000 элементов C.
  3. Индексируйте результат, чтобы получить первый элемент.

И заменить другим преобразованным деревом шаблонов выражений, которое делает:

  1. Захват А [0]
  2. Захват B [0]
  3. Захват C [0]
  4. Добавьте все 3 результата вместе, чтобы получить результат с + = избегая временных.

Думаю, он не лучше, чем шутка, но все же очень мощный.

1 голос
/ 27 апреля 2010

Нет, это не обязательно.Все, что дает вам некоторый доступ к дереву разбора, будет достаточно, чтобы вы могли манипулировать телом макроса таким же образом, как это делается в Common Lisp.Однако, поскольку манипулирование AST в lisp идентично манипулированию списками (что-то, что граничит с легким в семействе lisp), возможно, это не так естественно, если «дерево разбора» и «письменная форма» не будут по существуто же самое.

0 голосов
/ 10 мая 2019

Вы можете написать макрос в R (он больше похож на синтаксис Algol), который имеет представление о задержанном выражении, как в макросах LISP. Вы можете вызвать substitute() или quote(), чтобы не вычислять задержанное выражение, а получить фактическое выражение и просмотреть его исходный код, как в LISP. Даже структура исходного кода выражения такая же, как в LISP. Операторы являются первым пунктом в списке. например: input$foo, который получает свойство foo из списка input, поскольку выражение записывается как ['$', 'input', 'foo'], как в LISP.

Вы можете проверить электронную книгу Метапрограммирование в R , в которой также показано, как создавать макросы в R (не то, что вы обычно делаете, но это возможно). Он основан на статье 2001 Ниша программиста: Макросы в R , объясняющей, как писать макросы LIPS в R.

0 голосов
/ 02 октября 2018

Идите вперед и войдите в язык программирования Elixir .

Elixir - это функциональный язык программирования, похожий на Lisp по отношению к макросам, но он на одежде Руби и работает на вершинеErlang VM.

Для тех, кто не любит скобки, но хочет, чтобы их язык содержал мощные макросы, Elixir - отличный выбор.

0 голосов
/ 04 июля 2015

Шаблонные строки Javascript предлагают еще один подход к такого рода вещам. Например, quasiParserGenerator Марка С. Миллера реализует синтаксический синтаксис для синтаксических анализаторов.

0 голосов
/ 27 апреля 2010

Boo имеет приятный синтаксис макросов в кавычках, который использует [| |] в качестве разделителей и имеет определенные замены, которые фактически синтаксически проверяются конвейером компилятора с использованием $ переменных. Хотя он прост и относительно прост в использовании, его гораздо сложнее реализовать на стороне компилятора, чем s-выражений. Решение Boo может иметь несколько ограничений, которые не повлияли на мой собственный код. Есть также альтернативный синтаксис, который читается больше как обычный OO-код, но попадает в категорию «не для слабонервных», как, например, работа с деревьями разбора Ruby или Python.

0 голосов
/ 27 апреля 2010

Да, это, конечно, возможно. Особенно, если это все еще Лисп под капотом:

http://www.meta -alternative.net / pfront.pdf

http://www.meta -alternative.net / pfdoc.pdf

...