Пользовательский макрос assert C ++

Лучшее объяснение макросов Lisp, которые я когда-либо видел, по телефону

https://www.youtube.com/watch? v=4NO83wZVT0A

, запускающийся приблизительно в 55 минут в. Это - видео доклада, сделанного Peter Seibel, автором "Практического языка Common LISP", который является лучшим учебником Lisp существует.

мотивацию для макросов Lisp обычно трудно объяснить, потому что они действительно добиваются признания в ситуациях, которые слишком долги для представления в простом учебном руководстве. Peter придумывает яркий пример; можно схватить его полностью, и это преуспевает, надлежащее использование макросов Lisp.

Вы спросили: "Вы могли изменить функциональную природу LISP в более объектно-ориентированный синтаксис и семантику". Ответ - да. На самом деле Lisp первоначально не имел никакого объектно-ориентированного программирования вообще, не удивляя, так как Lisp был вокруг начиная с пути перед объектно-ориентированным программированием! Но когда мы сначала узнали об ООП в 1978, мы смогли добавить его к Lisp легко, использованию, среди прочего, макросам. В конечном счете Система объекта языка Common LISP (CLOS) была разработана, очень мощная система объектно-ориентированного программирования, которая соответствует изящно Lisp. Все это может быть загружено как расширение - ничто не встроено! Это все сделано с макросами.

Lisp имеет совершенно различную функцию, названную "макросы читателя", которые могут использоваться для расширения поверхностного синтаксиса языка. Используя макросы читателя, можно сделать подъязыки, которые имеют подобный C или подобный Рубину синтаксис. Они преобразовывают текст в Lisp, внутренне. Они не используются широко большинством настоящих программистов Lisp, главным образом потому что трудно расширить интерактивную среду разработки для понимания нового синтаксиса. Например, команды добавления отступа Emacs были бы перепутаны новым синтаксисом. Если Вы энергичны, тем не менее, Emacs расширяем также, и Вы могли бы преподавать его своему новому лексическому синтаксису.

27
задан Steven Lu 9 March 2011 в 21:37
поделиться

1 ответ

Хотя я не уверен, почему это (HALT(), 1) вместо просто HALT().

Я полагаю, что HALT может быть макросом (или другим именем) для exit. Скажем, мы хотели использовать exit(1) для нашей команды HALT. exit возвращает void, который не может быть оценен как второй аргумент &&. Если вы используете оператор запятой, который вычисляет свой первый аргумент, а затем вычисляет и возвращает значение его второго аргумента, у нас есть целое число (1), чтобы вернуться к &&, даже если мы никогда не достигнем этой точки, потому что HALT() будет заставь нас остановиться задолго до этого.

В принципе, любая функция, которая заполняется для HALT, вероятно, будет иметь возвращаемое значение void, потому что не имеет смысла возвращать какое-либо значение. Мы могли бы заставить его вернуть int, просто ради макроса, но если мы уже взломали макрос, немного больше взлома не может повредить, не так ли?

6
ответ дан 28 November 2019 в 05:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: