История изменений
Исправление lovesan, (текущая версия) :
Касательно «опиши задачу».
Задача:
- сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
ITEM1
ITEM2
...)
-
Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся при компиляции в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.
-
Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.
-
Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это всё должно происходить при компиляции, последовательно.
А, и да, все это в одном файле.
Нет, сайд-эффекты в САМИХ макросах делать нельзя(исключение тут - собственно для печати, ну это для примера). Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.
И да, надо сделать как в CL. То что «на любом тьюринг-полном языке» можно сделать вообще все, хоть вызывая компилятор сишечки, предварительно код нагенерировав, хоть интерпретируя JSON - никого не волнует.
Этот пример - вообще самая база, основа так сказать, макрологии. Люди, которые вообще не понимают, как это, зачем, и так далее, и при этом ставят клоунов - сами те еще клоуны, ну или жирные зеленые тролли.
Зачем делается переопределение? Ну часто, оно делается для бутстрапа чего-либо, какой-то библиотеки скажем, или даже компилятора, типа SBCL.
Исправление lovesan, :
Касательно «опиши задачу».
Задача:
- сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
ITEM1
ITEM2
...)
-
Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся при компиляции в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.
-
Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.
-
Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это всё должно происходить при компиляции, последовательно.
А, и да, все это в одном файле.
Нет, сайд-эффекты в САМИХ макросах делать нельзя. Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.
И да, надо сделать как в CL. То что «на любом тьюринг-полном языке» можно сделать вообще все, хоть вызывая компилятор сишечки, предварительно код нагенерировав, хоть интерпретируя JSON - никого не волнует.
Этот пример - вообще самая база, основа так сказать, макрологии. Люди, которые вообще не понимают, как это, зачем, и так далее, и при этом ставят клоунов - сами те еще клоуны, ну или жирные зеленые тролли.
Зачем делается переопределение? Ну часто, оно делается для бутстрапа чего-либо, какой-то библиотеки скажем, или даже компилятора, типа SBCL.
Исправление lovesan, :
Касательно «опиши задачу».
Задача:
- сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
ITEM1
ITEM2
...)
-
Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся при компиляции в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.
-
Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.
-
Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это всё должно происходить при компиляции, последовательно.
А, и да, все это в одном файле.
Нет, сайд-эффекты в САМИХ макросах делать нельзя. Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.
И да, надо сделать как в CL. То что «на любом тьюринг-полном языке» можно сделать вообще все, хоть вызывая компилятор сишечки, предварительно код нагенерировав, хоть интерпретируя JSON - никого не волнует.
Этот пример - вообще самая база, основа так сказать, макрологии. Люди, которые вообще не понимают, как это, зачем, и так далее, и при этом ставят клоунов - сами те еще клоуны, ну или жирные зеленые тролли.
Исправление lovesan, :
Касательно «опиши задачу».
Задача:
- сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
ITEM1
ITEM2
...)
-
Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся in-place в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.
-
Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.
-
Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это всё должно происходить при компиляции, последовательно.
А, и да, все это в одном файле.
Нет, сайд-эффекты в САМИХ макросах делать нельзя. Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.
И да, надо сделать как в CL. То что «на любом тьюринг-полном языке» можно сделать вообще все, хоть вызывая компилятор сишечки, предварительно код нагенерировав, хоть интерпретируя JSON - никого не волнует.
Этот пример - вообще самая база, основа так сказать, макрологии. Люди, которые вообще не понимают, как это, зачем, и так далее, и при этом ставят клоунов - сами те еще клоуны, ну или жирные зеленые тролли.
Исправление lovesan, :
Касательно «опиши задачу».
Задача:
- сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
ITEM1
ITEM2
...)
-
Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся in-place в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.
-
Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.
-
Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это всё должно происходить при компиляции, последовательно.
А, и да, все это в одном файле.
Нет, сайд-эффекты в САМИХ макросах делать нельзя. Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.
И да, надо сделать как в CL. То что «на любом тьюринг-полном языке» можно сделать вообще все, хоть вызывая компилятор сишечки, предварительно код нагенерировав, хоть интерпретируя JSON - никого не волнует.
Исправление lovesan, :
Касательно «опиши задачу».
Задача:
- сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
ITEM1
ITEM2
...)
-
Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся in-place в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.
-
Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.
-
Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это всё должно происходить при компиляции, последовательно.
А, и да, все это в одном файле.
Нет, сайд-эффекты в САМИХ макросах делать нельзя. Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.
Исходная версия lovesan, :
Касательно «опиши задачу».
Задача:
- сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
ITEM1
ITEM2
...)
-
Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся in-place в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.
-
Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.
-
Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это все должно происходит при компиляции, последовательно.
А, и да, все это в одном файле.
Нет, сайд-эффекты в САМИХ макросах делать нельзя. Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.