<commit_before>(ns learnclojure.chapt1.core5
  (:import (java.util Date UUID)))
;;一个简单函数的定义
(fn [x]
  (+ x 10))
;;函数定义的参数和调用函数实际传递的参数之间的定义是通过参数位置定义的
((fn [x]
   (+ x 10)) 8)
;;上面的代码相当于
(let [x 8]
  (+ x 10))
;;多个参数的函数
((fn [x y z]
   (+ x y z))
  3 4 12)
;;等价于
(let [x 3 y 4 z 12]
  (+ x y z))
;;函数可以有多个参数列表
(def strange-adder (fn adder-self-reference
                     ([x] (adder-self-reference x 1))
                     ([x y] (+ x y))))
;;等价于下面的代码，defn是一个封装了def和fn功能的宏，比较常用
(defn strange-adder
  ([x] (strange-adder x 1))
  ([x y] (+ x y)))
(strange-adder 1)
(strange-adder 1 2)
;;letfn可以定义同时定义多个具名函数，并且这些函数可以互相引用
(letfn [(odd? [n]
              (even? (- n 2)))
        (even? [n]
               (or (zero? n)
                   (odd? (- n 2))))]
  (even? 4))
;;可变参函数，下面函数中的rest被称为剩余参数
(defn concat-rest
  [_ & rest]
  (apply str (butlast rest)))
(concat-rest 1 2 3 4)
;;剩余参数可以像其他序列那样解构
(defn make-user1
  [& [user-id user-name]]
  {:user-id   (or user-id
                  (str (UUID/randomUUID)))
   :user-name (or user-name
                  (str (rand-int 10)))})
;;(make-user)
(make-user1 "ef2f2a")
;;关键字参数。可以让函数使用者不必按某个特定的顺序传参
(defn make-user2
  [username & {:keys [email join-date]
               :or   {join-date (Date.)}}]
  {:user-name username<commit_msg>根据clojure 编程这书的勘误做的修改<commit_after>(ns learnclojure.chapt1.core5
  (:import (java.util Date UUID)))
;;一个简单函数的定义
(fn [x]
  (+ x 10))
;;函数定义的参数和调用函数实际传递的参数之间的定义是通过参数位置定义的
((fn [x]
   (+ x 10)) 8)
;;上面的代码相当于
(let [x 8]
  (+ x 10))
;;多个参数的函数
((fn [x y z]
   (+ x y z))
  3 4 12)
;;等价于
(let [x 3 y 4 z 12]
  (+ x y z))
;;函数可以有多个参数列表
(def strange-adder (fn adder-self-reference
                     ([x] (adder-self-reference x 1))
                     ([x y] (+ x y))))
;;等价于下面的代码，defn是一个封装了def和fn功能的宏，比较常用
(defn strange-adder
  ([x] (strange-adder x 1))
  ([x y] (+ x y)))
(strange-adder 1)
(strange-adder 1 2)
;;letfn可以定义同时定义多个具名函数，并且这些函数可以互相引用
(letfn [(odd? [n]
              (if (zero? n)
                false
                (even? (dec n))))
        (even? [n]
               (or (zero? n)
                   (odd? (dec n))))]
  (odd? 12))
;;可变参函数，下面函数中的rest被称为剩余参数
(defn concat-rest
  [_ & rest]
  (apply str (butlast rest)))
(concat-rest 1 2 3 4)
;;剩余参数可以像其他序列那样解构
(defn make-user1
  [& [user-id user-name]]
  {:user-id   (or user-id
                  (str (UUID/randomUUID)))
   :user-name (or user-name
                  (str (rand-int 10)))})
;;(make-user)
(make-user1 "ef2f2a")
;;关键字参数。可以让函数使用者不必按某个特定的顺序传参
(defn make-user2
  [username & {:keys [email join-date]
               :or   {join-date (Date.)}}]
  {:user-name username
{'fraction_non_alphanumeric': 0.180390654921486, 'fraction_numerical': 0.02795863653772501, 'mean_word_length': 2.383419689119171, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '799715', 'n_tokens_mistral': 1370, 'n_tokens_neox': 1355, 'n_words': 274}