2015-04-13 2 views
1

Я пытался больше думать о том, что абстракция на самом деле означает в функциональном программировании. Самое лучшее сообщение, которое я нашел, говорит, что тип языка, который я могу понять, следующий 4 abstractions. Однако, так как я программист Clojure wannabe, мне интересно, какие макросы абстракций предоставляют. Кажется, что они вписываются в стадию 2 вместе с HOF, но в то же время они больше HOF. Я считаю, что этап 3 связан с проблемой выражения и будет протоколом и несколькими методами в Clojure. Поэтому мой вопрос:Что такое абстракции макросов в Clojure?

При реализации макроса на языке Lisp, что бы вы сказали, что вы абстрагируетесь?

Что будет на этапе 3 и 4 на языке Лиспа?

+0

Хороший вопрос, но это более подходит для [CSSE] (http://cs.stackexchange.com/). Я бы сказал, макрос абстрактно, как на этапе 1, но во время компиляции. В то время как функции преобразуют значения, преобразуют код макросов, и этот код фактически запускается. – Sylwester

+0

Я согласен со всеми частями ответа @ TimothyBaldridge, что я квалифицирован для оценки. Я бы просто подчеркнул, что они используют Lisp для перезаписи исходного кода Lisp. Я не думаю, что макросы вписываются в список четырех абстракций, поскольку они действуют до оценки. Однако макросы можно считать абстракцией в этом смысле: вы можете использовать макрос для абстрактного шаблона, который является общим для нескольких различных функций, генерируя эти функции из макроса. Это подчеркивает, почему макросы часто (и должны) избегать: функции HO уже позволяют что-то подобное. – Mars

ответ

2

Я не рассматриваю макросы как абстракцию, но скорее как компилятор.

Большинство языков реализует так называемое абстрактное дерево синтаксиса (или AST). Это представление кода программы в виде структуры данных. Макросы Lisp выставляют части этого AST как данные, которые могут быть преобразованы с помощью макрофункции. Но поскольку lisp-программы сами являются структурами данных, макросы, как правило, немного чисты в программах lisp, тогда они будут в Rust или Scala.

Таким образом, можно сказать, что макросы - это просто абстракции семантики языка ... но я не знаю, что я согласен с этим. Можно сказать, что макросы являются расширениями компилятора lisp, но это не совсем так.

Как оказалось, макросы довольно ограничены. Они могут видеть только небольшой подраздел скомпилированного кода. Другими словами, макрос не может видеть дерево, только вниз. Кроме того, в то время как макросы, которые выполняют глубокую проверку детей в АСТ, являются возможными (так называемые макросы глубокой ходьбы), эти макросы имеют тенденцию быть сложными и подверженными ошибкам (просто посмотрите на кишки core.async's go или содержимое среднего уровня, чтобы увидеть, как комплекс, который они могут получить). Поэтому я не решаюсь назвать их абстракциями, может быть, они есть, возможно, это просто очень ограниченные абстракции.

Итак, я вижу макросы как странное сочетание между более мощными Fexprs (http://en.wikipedia.org/wiki/Fexpr) и более полными преобразованиями кода компилятора, найденными в таких проектах, как LLVM. Они обеспечивают очень ограниченный контролируемый способ преобразования кода во время компиляции, вот и все.

И, в конце концов, все сводится к lisp-мантре, что «код - это код». Если ваш код является данными, имеет смысл предоставить способы его преобразования во время компиляции.

Смежные вопросы