Clojure: Можете ли вы использовать Concat с другими очень сложными функциями? - PullRequest
0 голосов
/ 07 марта 2020
(ns untitled1.core
  (:require [clojure.string :as str]))

(defn nottrue                              ;helper function for below function
 [inp]
 (not (true? inp))
 )

(defn and-simplify 
"function that, for example, takes: (and-simplify '(and true false)) and evaluates it -> false. 
This function works perfectly if called directly from REPL."
  [last]

  (cond
(some false? last) false
(every? true? (rest last)) true
(= 1 (count (filter nottrue (rest last)))) (let [xyz (filter nottrue (rest last))] xyz)
:else (let [xxx (filter nottrue last)] xxx)
) )


(defn concact_function 
"When the user types: (concact_function '(and false true) '(and true true true false)). It should
return -> Concacted Version: (and true true true false)"
  [my_expression original]

   (println "Concacted Version: " (concat (drop-last original) (and-simplify my_expression)))
  )

Когда я ввожу: (concact_function '(и false true true)' (и true true true true false))

Это возвращается: Ошибка выполнения (IllegalArgumentException) в untitled1.core / concact-function (core.clj: 26). Не знаю, как создать ISeq из: java .lang.Boolean Concacted Version: (и правда true

Я сделал небольшую отладку и обнаружил, что проблема заключается в том, что я пытаюсь сжиматься (и -simplify my-выражение вернуть его для дальнейших манипуляций. Но я печатаю это ради визуализации)

1 Ответ

0 голосов
/ 10 марта 2020

concat функция работает с коллекциями, функция and-simplify возвращает только bool. Чтобы исправить это, вы можете поместить все свое условие cond в вектор или список или поместить возврат каждого предложения cond в вектор.

Со следующим исправлением:

    (defn and-simplify 
      "function that, for example, takes: (and-simplify '(and true false)) and evaluates it -> false. 
      This function works perfectly if called directly from REPL."
      [last]
      [(cond
          (some false? last) false
          (every? true? (rest last)) true
          (= 1 (count (filter nottrue (rest last)))) (let [xyz (filter nottrue (rest last))] xyz)
          :else (let [xxx (filter nottrue last)] xxx)
          )])

Will вернуть ожидаемый результат: Concacted Version: (and true true true false)

...