Clojure, как отправить некоторые аргументы функции, которая вызывается как символ

90
11

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

Например, работает следующий код:

(let [a [0 1 2]]
(eval (list ({:fun 'count} :fun) a))) => 3

и этот код работает для цитируемого "a, когда он определяется глобально:

(def a [0 1 2])
(eval (list ({:fun 'count} :fun) 'a))

но этот код не работает:

(let [a [0 1 2]]
(eval (list ({:fun 'count} :fun) 'a)))
=> Unable to resolve symbol: a in this context

Первый фрагмент отлично подходит для небольших векторов, таких как этот, но когда мне нужно передать вектор из нескольких тысяч элементов, то недоказу "a" вызовет ошибку для "Метод слишком большой", потому что фактический метод, отправленный на машина:

(let [a [0 1 2]]
(eval (count [0 1 2]))

Что такое простой способ выполнения вызова функции с самой переменной как аргументом?

спросил(а) 2021-01-19T19:58:09+03:00 6 месяцев, 1 неделя назад
1
Решение
63

Не ясно, почему вы eval ИНГ Символ 'count. Разве вы не можете просто сохранить функцию count на карте и называют его следующим образом:

(let [a [0 1 2]] (({:fun count} :fun) a)) => 3

Тогда вектор a может быть любого размера, который вам нравится.

    Не используйте eval где будет выполняться макрос. Не используйте макрос, где будет выполняться функция.

Оглядываясь назад, все, что вы сделали, это отложить компиляцию, когда это легко, когда это сложно.

ответил(а) 2021-01-19T19:58:09+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема