Невозможно передать список в качестве аргумента функции - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть функция замены, которая примет выражение, такое как (or false x y), и карту привязки, такую ​​как '{x false, y true}, и вернет список с соответствующими заменами.Результат в l и отображается.Как я могу передать l в другую функцию для выполнения какой-либо другой обработки?Определение функции, которую я передаю, выглядит следующим образом:

(defn f [expression]
    )

Я пытался передать l в качестве параметра при вызове f, но я получаю следующую ошибку:

IllegalArgumentException Don't know how to create ISeq from: clojure.lang.Symbol  clojure.lang.RT.seqFrom (RT.java:550)

Вот моя замещающая функция:

    (defn deep-substitute [m l]
  (map (fn [i]
         (if (seq? i)
           (deep-substitute m i)
           (m i i)))
       l
       (f 'l)))

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

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Задача deep-substitute - заполнить шаблон формы и вернуть ее.Проблема усложняется, если вы попытаетесь сделать deep-substitute также ответственным за выполнение следующего шага в преобразованиях.Возможно, пусть оно вернет значение, а затем передаст это значение другой функции преобразования после того, как оно будет возвращено.

Вот аннотированный рабочий пример:

user>  (defn deep-substitute [m l]      
         (map (fn [i]          
                (if (seq? i)             ;; if this is a sequence, 
                  (deep-substitute m i)  ;; finish the sequence and include the result here
                  (get m i i)))          ;; otherwise get the new value from the map, if found
              l))                        ;; if it's not found, us the value unchanged.
#'user/deep-substitute

, а затем протестируйте его на своем примере:

user> (deep-substitute '{x false, y true} '(or false x y))
(or false false true)

и более вложенный пример:

user> (deep-substitute '{x false, y true} '(or false (and x (or y x)) y))
(or false (and false (or true false)) true)

общий следующий шаг - обернуть его в макрос, чтобы он мог изменять формы перед их оценкой, а затем оценивать вновь созданные из ввыясните, какое значение это становится:

user> (defmacro dsub [m l]
        (deep-substitute m l))
#'user/dsub

и протестируйте его

user> (dsub {x false, y true} (or false (and x (or y x)) y))
true

user> (dsub {x false, y true} (or false  x))
false

или передайте полученную форму (без оценки) в другую функцию, вложив ее:

user> (defn f [expression]
        (reverse expression))
#'user/f

user> (f (deep-substitute '{x false, y true} '(or false (and x (or y x)) y)))
(true (and false (or true false)) false or)

Распространенным шаблоном является использование потоковых макросов -> ->> и т. Д. Для передачи результата от преобразования к преобразованию до получения окончательного результата путем составления множества простых операций:

user> (->> '(or false (and x (or y x)) y)
           (deep-substitute '{x false, y true})
           f
           (deep-substitute '{false, 41 true 42}))
(42 (and 41 (or 42 41)) 41 or)
0 голосов
/ 30 сентября 2018

сначала попробуйте с базовым подходом списка передачи в качестве аргумента функции.Ниже приведен пример

(defn passlist [a]
  (println a))
(passlist '(1 2 3))

Вывод будет:

#'user/passlist
(1 2 3) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...