2016-02-10 6 views
0

Я знаю, что этот пример тривиален, потому что я думаю, что есть функция библиотеки clojure, которая сделает это, это не главное.Clojure, возвращающий список

У меня есть следующий код

(defn makelistres [a b res] 
    (if (= a b) res (makelistres a (dec b) (conj res b)))) 

(defn makelist [a b] 
    (makelistres a b []) 
) 

Есть ли способ, чтобы сделать тот же эффект, без необходимости проходить список в качестве параметра? Такие, как бросать его в стек

Таких, как

(defn test [a b] 
    (if (= a b) 0 (+ 1 (test a (dec b)))) 
) 

Не знаю, если скобка совпадают, как я писал в этом текстовом поле, но вы получите точку.

+0

Непонятно, что вы имеете в виду, но вы можете избежать использования параметра res, используя вместо этого цикл. если вы заинтересованы в том, что вы используете recursive calls, то recur может избежать этого. –

+0

Да, конечная цель - избежать параметра res, есть ли способ сделать это без цикла? –

+0

Какова ваша функция 'makelistres'? Я уверен, что это работает, но я просто хотел бы знать, чего ожидать при запуске в REPL. –

ответ

4

это возможность добавить еще одну arity к функции, которая затем вызовет функцию с дополнительным arg (пустой вектор)?

так:

(defn makelist 
    ([a b] (makelist a b [])) 
    ([a b res] 
    (if (== a b) res (makelist a (dec b) (conj res b))))) 

в РЕПЛ:

user> (makelist 1 10) 
[10 9 8 7 6 5 4 3 2] 

, если нет, то loop будет делать:

(defn makelist [a b] 
    (loop [a a b b res []] 
    (if (== a b) 
     res 
     (recur a (dec b) (conj res b))))) 

или как это (поскольку a не изменяется):

(defn makelist [a b] 
    (loop [b b res []] 
    (if (== a b) 
     res 
     (recur (dec b) (conj res b))))) 

но да, есть Lib функция для этого: (range 10 1 -1)

+0

Отлично! Спасибо! –

-2

Джон

Есть несколько способов:

(def res [1,2,3,4,5])

Однако это требует априорно определение данных перед вызовом makelistres. Есть способы сделать это.

(def res-val (atom [])

Это является более гибким, используя функции, основанные атом для установки и извлечения программно. Однако; вы используете изменяемый (stateful) объект. Ваша идеология может избежать этого!

Поскольку вы меняете содержание res, подход atom кажется более подходящим. Вы в основном задали бы значение res (using swap) вещь от makelist и derefing (e.g. @res) или изменяя его в рекурсии makelistres.

Смежные вопросы