Возможность замены текста в макросах clojure, таких как C #define - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу написать макрос

(defmacro params [] 'a 'b 'c)

, который будет использоваться в таких местах, как это

;; without macro
(fnc a b c)

;; with macro
(fnc params) => (fnc a b c)

Если вы видите, что это может быть легко сделано с помощью #define C, который был простозамена текста

Но это просто возвращает 'c

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Я не совсем уверен , почему вы хотите это сделать, но в ближайшем будущем обычно используют следующий idom:

(defmacro with-params
  [params fncall]
  `~(concat fncall params))

(defn myfn [x y z]
  (spyx :myfn [x y z]))

(let [a 1
      b 2
      c 3]
  (println :with-params)
  (with-params [a b c]
    (myfn))

с результатом:

:with-params
:myfn [x y z] => [1 2 3]

Если, однако, вы хотите жестко закодировать код, чтобы всегда использовать параметры a, b и c, вы можете сделать это:

(defmacro with-params-abc
  [fncall]
  `~(concat fncall '[a b c]))

(println :with-params-abc)
(with-params-abc
  (myfn))

с результатом:

:with-params-abc
:myfn [x y z] => [1 2 3]
0 голосов
/ 01 февраля 2019

Смысл макросов в стиле Lisp заключается в том, что они работают с кодом , а не с текстом (или, более конкретно, с абстрактным синтаксическим деревом вместо последовательность токенов ), и это делает их чрезвычайно полезными, чем препроцессор C.

То, что вы на самом деле намереваетесь сказать, это сказать, что функция должна вызываться с тремя аргументами, которые происходят сбыть значениями переменных с одинаковыми именами на каждом сайте вызова.Это довольно много предположений.Давайте посмотрим, как это будет выглядеть на практике:

(def-magic-splat-macro params    ; whatever, doesn't exist
  a b c)

(defn foo [a]
  (let [b (frob a)
        c (blah)]
    (func params)))  ; What the hell

Я не понимаю, как это может быть полезно, кроме как для запутывания.

Если вы хотите определить стандартные параметры:

(def standard-params [1 "quux" :never])  ; values!

(defn foo [bar]
  …
  (apply func standard-params))
...