LINUX.ORG.RU

История изменений

Исправление lovesan, (текущая версия) :

Касательно «опиши задачу».

Задача:

  1. сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
  ITEM1
  ITEM2
  ...)
  1. Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся при компиляции в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.

  2. Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.

  3. Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это всё должно происходить при компиляции, последовательно.

А, и да, все это в одном файле.

Нет, сайд-эффекты в САМИХ макросах делать нельзя(исключение тут - собственно для печати, ну это для примера). Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.

И да, надо сделать как в CL. То что «на любом тьюринг-полном языке» можно сделать вообще все, хоть вызывая компилятор сишечки, предварительно код нагенерировав, хоть интерпретируя JSON - никого не волнует.

Этот пример - вообще самая база, основа так сказать, макрологии. Люди, которые вообще не понимают, как это, зачем, и так далее, и при этом ставят клоунов - сами те еще клоуны, ну или жирные зеленые тролли.

Зачем делается переопределение? Ну часто, оно делается для бутстрапа чего-либо, какой-то библиотеки скажем, или даже компилятора, типа SBCL.

Исправление lovesan, :

Касательно «опиши задачу».

Задача:

  1. сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
  ITEM1
  ITEM2
  ...)
  1. Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся при компиляции в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.

  2. Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.

  3. Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это всё должно происходить при компиляции, последовательно.

А, и да, все это в одном файле.

Нет, сайд-эффекты в САМИХ макросах делать нельзя. Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.

И да, надо сделать как в CL. То что «на любом тьюринг-полном языке» можно сделать вообще все, хоть вызывая компилятор сишечки, предварительно код нагенерировав, хоть интерпретируя JSON - никого не волнует.

Этот пример - вообще самая база, основа так сказать, макрологии. Люди, которые вообще не понимают, как это, зачем, и так далее, и при этом ставят клоунов - сами те еще клоуны, ну или жирные зеленые тролли.

Зачем делается переопределение? Ну часто, оно делается для бутстрапа чего-либо, какой-то библиотеки скажем, или даже компилятора, типа SBCL.

Исправление lovesan, :

Касательно «опиши задачу».

Задача:

  1. сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
  ITEM1
  ITEM2
  ...)
  1. Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся при компиляции в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.

  2. Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.

  3. Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это всё должно происходить при компиляции, последовательно.

А, и да, все это в одном файле.

Нет, сайд-эффекты в САМИХ макросах делать нельзя. Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.

И да, надо сделать как в CL. То что «на любом тьюринг-полном языке» можно сделать вообще все, хоть вызывая компилятор сишечки, предварительно код нагенерировав, хоть интерпретируя JSON - никого не волнует.

Этот пример - вообще самая база, основа так сказать, макрологии. Люди, которые вообще не понимают, как это, зачем, и так далее, и при этом ставят клоунов - сами те еще клоуны, ну или жирные зеленые тролли.

Исправление lovesan, :

Касательно «опиши задачу».

Задача:

  1. сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
  ITEM1
  ITEM2
  ...)
  1. Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся in-place в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.

  2. Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.

  3. Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это всё должно происходить при компиляции, последовательно.

А, и да, все это в одном файле.

Нет, сайд-эффекты в САМИХ макросах делать нельзя. Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.

И да, надо сделать как в CL. То что «на любом тьюринг-полном языке» можно сделать вообще все, хоть вызывая компилятор сишечки, предварительно код нагенерировав, хоть интерпретируя JSON - никого не волнует.

Этот пример - вообще самая база, основа так сказать, макрологии. Люди, которые вообще не понимают, как это, зачем, и так далее, и при этом ставят клоунов - сами те еще клоуны, ну или жирные зеленые тролли.

Исправление lovesan, :

Касательно «опиши задачу».

Задача:

  1. сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
  ITEM1
  ITEM2
  ...)
  1. Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся in-place в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.

  2. Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.

  3. Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это всё должно происходить при компиляции, последовательно.

А, и да, все это в одном файле.

Нет, сайд-эффекты в САМИХ макросах делать нельзя. Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.

И да, надо сделать как в CL. То что «на любом тьюринг-полном языке» можно сделать вообще все, хоть вызывая компилятор сишечки, предварительно код нагенерировав, хоть интерпретируя JSON - никого не волнует.

Исправление lovesan, :

Касательно «опиши задачу».

Задача:

  1. сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
  ITEM1
  ITEM2
  ...)
  1. Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся in-place в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.

  2. Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.

  3. Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это всё должно происходить при компиляции, последовательно.

А, и да, все это в одном файле.

Нет, сайд-эффекты в САМИХ макросах делать нельзя. Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.

Исходная версия lovesan, :

Касательно «опиши задачу».

Задача:

  1. сделать макрос, который опередяет енумы, вида.
(define-enum ENUM-NAME
  ITEM1
  ITEM2
  ...)
  1. Написать функцию enum-value, которая берет два символа - имя енума, и имя итема, и возвращает числовое значение. Усложнение задачи - написать МАКРОС, enum, принимающий два символа, не вычисляющий их, и вычисляющийся in-place в собственно число-значение. В CL кстати также можно написать compiler macro, для таких случаев, что обычно и делается, в том же CFFI итд.

  2. Написать макрос foo, который во время компиляции печатает на стандартный вывод значение итема foo из енума my-enum.

  3. Подряд вызывать define-enum определяющий этот my-enum, и foo, но каждый раз, чтобы my-enum имел foo разным значением. Вывести все так чтобы показывалось как у меня в примере - 0 и 1. Это все должно происходит при компиляции, последовательно.

А, и да, все это в одном файле.

Нет, сайд-эффекты в САМИХ макросах делать нельзя. Всмысле ну как. Что в CL, что в Clojure на самом деле, нельзя сказать, сколько раз вызовется макрос, поэтому так никто не делает, это говнокод. Есть хаки с compiler-let из cltl2, которые дают некоторые гарантии, но в целом - нет.