Я работаю над упражнением «Числа Армстронга» на дорожке Clojure в упражнении.Число Армстронга - это число, равное сумме его цифр, возведенной в степень числа цифр.153 - это число Армстронга, потому что: 153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153
.154 не является числом Армстронга, потому что: 154 != 1^3 + 5^3 + 4^3 = 1 + 125 + 64 = 190
.
Тестовый файл для этого упражнения вызовет функцию armstrong?
, передаст число и ожидает истину, если число является числом Армстронга.Я уже решил проблему с этим кодом:
(ns armstrong-numbers)
(defn pow [a b]
(reduce * 1 (repeat b a)))
(defn armstrong? [num]
(->> num
(iterate #(quot % 10))
(take-while pos?)
(map #(mod % 10))
((fn [sq]
(map #(pow % (count sq))
sq)))
(apply +)
(= num)))
, но сейчас я пытаюсь изменить код.Вот как я хотел бы, чтобы код выглядел следующим образом:
(ns armstrong-numbers
(:require [swiss.arrows :refer :all]))
(defn pow [a b]
(reduce * 1 (repeat b a)))
(defn armstrong? [num]
(-<>> num
(iterate #(quot % 10))
(take-while pos?)
(map #(mod % 10))
(map #(pow % (count <>))
<>)
(apply +)
(= num)))
Ссылка на требуемый выше пакет: https://github.com/rplevy/swiss-arrows.
В первом разделе кода я создаю неявную функцию внутримакрос последнего потока, потому что последовательность, возвращаемая из формы карты, необходима в двух разных местах во второй форме карты.Эта неявная функция работает просто отлично, но я просто хотел сделать код более гладким.Но когда я тестирую второй блок кода, я получаю следующую ошибку: java.lang.RuntimeException: Unable to resolve symbol: <> in this context
.
Я получаю эту ошибку, использую ли я #()
, partial
или fn
внутри формы второй карты.Я выяснил, что, поскольку все предшествующие являются макросами (или специальной формой в случае fn
), они не могут разрешить <>
, потому что это имеет смысл только для макроса -<>>
, который вызывается на более позднем этапеmacroexpansion.Но почему #()
, partial
и fn
пытаются разрешить этот символ вообще?Насколько я вижу, у них нет причин знать, что это за символ или какова его цель.Все, что им нужно сделать, это вернуть этот символ, переставленный в правильные s-выражения.Так почему же clojure пытается разрешить этот (<>
) символ?