几分钟内学习Clojure

来源:互联网 发布:星夜床垫 知乎 编辑:程序博客网 时间:2024/04/27 14:05

此处获取源码: test.clj

Clojure是JVM上的一个LISP语言变种。它比Common Lisp更强调纯函数式编程,但提供了一些STM工具以处理它所引入的状态问题。

这个组合使并行处理更加简单,并且通常是自动的。

(你需要Clojure 1.2或以上版本。)

  1. ; 分号作为注释的开始  
  2.  
  3. ; Clojure 用一种把元素用括号括起来的像列表一样的方式来书写,元素之间用空格隔开  
  4. ; clojure 解释器会把第一个元素当做是函数或者宏调用,其他的都作为参数  
  5. ; 下面这个函数用于设置当前的命名空间  
  6. (ns test)  
  7.  
  8. ; 更多基本的例子:  
  9.  
  10. ; str 函数会用它所有的参数创造一个字符串  
  11. (str "Hello" " " "World") ; => "Hello World" 
  12.  
  13. ; 数学运算很直观,不过是前缀表达式  
  14. (+ 1 1) ; => 2  
  15. (- 2 1) ; => 1  
  16. (* 1 2) ; => 2  
  17. (/ 2 1) ; => 2  
  18.  
  19. ;  相等比较使用 “=”符号  
  20. (= 1 1) ; => true 
  21. (= 2 1) ; => false 
  22.  
  23. ; 你也不必担心逻辑运算  
  24. (not true) ; => false 
  25.  
  26. ; 嵌套方式正如你预料的那样  
  27. (+ 1 (- 3 2)) ; = 1 + (3 - 2) => 2  
  28.  
  29. ; 类型系统  
  30. ;;;;;;;;;;;;;  
  31.  
  32. ; Clojure 使用java对象类型来表示 布尔值、字符串和数字  
  33. ; 使用 `class`函数来检测它们.  
  34. (class 1) ; 整形字面值默认是java中的Long类型  
  35. (class 1.); 浮点字面值对应着java中的Double类型  
  36. (class ""); 字符串总是用双引号括起来,并且对应着java中的Sring类型  
  37. (class false) ;布尔值对应着java中的Boolean类型  
  38. (class nil); null值被称为 nil(英语含义:无、零点)  
  39.  
  40. ; 如果你想创建一列数据字面值, 使用一个单引号 ' 来防表达式被解析执行  
  41. '(+ 1 2) ; => (+ 1 2) ;这里没有返回3  
  42. ; (上面表达式和(quote (+ 1 2)) 等价,不过更简洁  
  43.  
  44. ; 你可以运算一个引用列表  
  45. (eval '(+ 1 2)) ; => 3  
  46.  
  47. ; 集合和序列  
  48. ;;;;;;;;;;;;;;;;;;;  
  49.  
  50. ; 向量和列表也是java类哦!!  
  51. (class [1 2 3]); => clojure.lang.PersistentVector  
  52. (class '(1 2 3)); => clojure.lang.PersistentList  
  53.  
  54. ;书写一个列表形如(1 2 3)一样简单, 但是我们不得不把它“引”(前面加个单引号)起来  
  55. ;这样就能防止解释器把它当做一个函数来解析  
  56. ;另外,(list 1 2 3) 和 '(1 2 3) 等价  
  57.  
  58. ;列表和向量都是集合:  
  59. (coll? '(1 2 3)) ; => true 
  60. (coll? [1 2 3]) ; => true 
  61.  
  62. ; 只有列表是序列.(序列是有顺序的)  
  63. (seq? '(1 2 3)) ; => true 
  64. (seq? [1 2 3]) ; => false 
  65.  
  66. ; 序列是列表一种逻辑上的接口,可以懒加载.  
  67. "懒" 意味着可以定义无穷序列,就像下面一样:  
  68. (range 4) ; => (0 1 2 3)  
  69. (range) ; => (0 1 2 3 4 ...) (一个无穷序列)  
  70. (take 4 (range)) ;  (0 1 2 3)  
  71.  
  72. ; 使用cons 来追加一个元素到列表或者向量的头部  
  73. (cons 4 [1 2 3]) ; => (4 1 2 3)  
  74. (cons 4 '(1 2 3)) ; => (4 1 2 3)  
  75.  
  76. ; 使用conj追加一个元素到列表的头部,或者向量的尾部,  
  77. (conj [1 2 3] 4) ; => [1 2 3 4]  
  78. (conj '(1 2 3) 4) ; => (4 1 2 3)  
  79.  
  80. ; 使用concat来连接列表和向量  
  81. (concat [1 2] '(3 4)) ; => (1 2 3 4)  
  82.  
  83. ; 使用filter, map 来进行列表计算  
  84. (map inc [1 2 3]) ; => (2 3 4)  
  85. (filter even? [1 2 3]) ; => (2)  
  86.  
  87. ; 使用reduce 来进行化繁为简  (map/reduce 思想就来自于lisp)  
  88. (reduce + [1 2 3 4])  
  89. ; = (+ (+ (+ 1 2) 3) 4)  
  90. ; => 10  
  91.  
  92. ; Reduce 可以使用一个初始值  
  93. (reduce conj [] '(3 2 1))  
  94. ; = (conj (conj (conj [] 3) 2) 1)  
  95. ; => [3 2 1]  
  96.  
  97. ; 函数  
  98. ;;;;;;;;;;;;;;;;;;;;;  
  99.  
  100. ; 使用fn来创建一个函数。所有的函数都有返回值,就是它的最后一个表达式  
  101. (fn [] "Hello World") ; => fn  
  102.  
  103. ; (你需要额外的括号去调用它)  
  104. ((fn [] "Hello World")) ; => "Hello World" 
原文链接:http://www.cxypub.com/portal.php?mod=view&aid=43
原创粉丝点击