Все, я начинаю смотреть на 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
Спасибо за любую помощь, которую вы можете мне предоставить!