Все, я начинаю смотреть на язык Clojure, и у меня возникла пара вопросов о том, что я пытаюсь сделать.Общая цель состоит в том, чтобы создать псевдоним функции последовательности от every?
до all?
.Я уверен, что есть функция или макрос, которые делают псевдонимы (или что-то в этом роде), но я хотел посмотреть, возможно ли это с некоторыми базовыми конструкциями, которые я знаю до сих пор.Мой подход заключался в определении функции с именем all?
, которая применяет свои аргументы к реализации every?
.
Мне любопытно посмотреть, можно ли сделать это независимым, поэтому я хотел, чтобы параметр моей функции псевдонима принял два аргумента: новое имя (в качестве ключевого слова) и старое имя (в качестве ссылки на функцию),Стремясь к этой цели, я столкнулся с двумя проблемами:
1) Определение именованных функций с помощью ключевых слов приводит к ошибкам.Видимо, он хочет clojure.lang.IObj
.
user=> (defn :foo "bar")
java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to clojure.lang.IObj (NO_SOURCE_FILE:0)
Существует ли функция для преобразования ключевого слова в IObj или другие средства для параметризации имени вновь определенной функции с некоторым предоставленным значением?(В Ruby для этого используется define_method среди других методов)
irb(main)> self.class.instance_eval do
irb(main)* define_method(:foo) { "bar" }
irb(main)> end
=> #<Proc>
irb(main)> foo
=> "bar"
2) Соберите все аргументы функции в одну переменную.Даже базовые функции, такие как (+ 1 2 3 4)
, принимают переменное количество аргументов.Все техники определения функций, которые я видел до сих пор, принимают определенное количество аргументов, без возможности просто объединить все в списке для обработки в теле функции.Еще раз, то, что я собираюсь сделать, сделано в Ruby следующим образом:
irb(main)> def foo(*args)
irb(main)> p args
irb(main)> end
=> nil
irb(main)> foo(1, 2, 3)
[1, 2, 3]
=> nil
Спасибо за любую помощь, которую вы можете оказать мне!