Clojure

学习 Clojure - 答案

目录

此页面包含《学习 Clojure》指南中“测试你的知识”部分的解答。

语法

  1. 使用 REPL,计算 7654 和 1234 的和。

    user=> (+ 7654 1234)
    8888
  2. 将以下代数表达式重写为 Clojure 表达式:( 7 + 3 * 4 + 5 ) / 10

    (/ (+ 7 (* 3 4) 5) 10)
  3. 使用 REPL 文档函数,查找 rem 和 mod 函数的文档。根据文档比较提供的表达式的结果。

    user=> (doc rem)
    clojure.core/rem
    ([num div])
      remainder of dividing numerator by denominator.
    nil
    
    user=> (doc mod)
    clojure.core/mod
    ([num div])
      Modulus of num and div. Truncates toward negative infinity.
    nil
  4. 使用 find-doc,查找打印最近 REPL 异常的堆栈跟踪的函数。

    pst

函数

  1. 定义一个名为 greet 的函数,该函数不带参数并打印“Hello”。

    (defn greet []
      (println "Hello"))
  2. 使用 deffn#() 重定义 greet。

    ;; using fn
    (def greet
      (fn [] (println "Hello")))
    
    ;; using #()
    (def greet
      #(println "Hello"))
  3. 定义一个名为 greeting 的函数……

    (defn greeting
      ([] (greeting "Hello" "World"))
      ([x] (greeting "Hello" x))
      ([x y] (str x ", " y "!")))
  4. 定义一个名为 do-nothing 的函数……

    (defn do-nothing [x] x)
  5. 定义一个名为 always-thing 的函数……

    (defn always-thing [& xs] 100)
  6. 定义一个名为 make-thingy 的函数……

    (defn make-thingy [x]
      (fn [& args] x))
  7. 定义一个名为 triplicate 的函数……

    (defn triplicate [f]
      (f) (f) (f))
  8. 定义一个名为 opposite 的函数……

    (defn opposite [f]
      (fn [& args] (not (apply f args))))
  9. 定义一个名为 triplicate2 的函数……

    (defn triplicate2 [f & args]
      (triplicate (fn [] (apply f args))))
  10. 使用 java.lang.Math 类……

    user=> (Math/cos Math/PI)
    -1.0
    user=> (+ (Math/pow (Math/sin 0.2) 2)
              (Math/pow (Math/cos 0.2) 2))
    1.0
  11. 定义一个函数,该函数将 HTTP URL 作为字符串……

    (defn http-get [url]
      (slurp
        (.openStream
          (java.net.URL. url))))
    (defn http-get [url]
      (slurp url))
  12. 定义一个名为 one-less-arg 的函数

    (defn one-less-arg [f x]
      (fn [& args] (apply f x args)))
  13. 定义一个名为 two-fns 的函数

    (defn two-fns [f g]
      (fn [x] (f (g x))))