zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Clojure 学习入门(5)- 关键字

学习入门 关键字 Clojure
2023-09-14 09:16:11 时间
一、创建:  

Keyword: 关键字是一个内部字符串; 两个同样的关键字指向同一个对象; 通常被用来作为map的key。 

[python]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. user=> (keyword "foo")  
  2. :foo  
  3. user=> (keyword 'foo)  
  4. :foo  
  5. user=> (keyword "abc def")  
  6. :abc def  
  7. user=> (keyword "abcdef")  
  8. :abcdef  
  9. user=> (keyword "/abc/def/ghi")  
  10. :/abc/def/ghi  
  11. user=> (keyword "user" "foo")  
  12. :user/foo  
  13. user=> (keyword nil)  
  14. nil  
  15. user=> (keyword 123)  
  16. nil  
  17. user=> (keyword 0)  
  18. nil  

Symbol: Symbol是用来给东西命名的. 这些名字是被限制在名字空间里面的,要么是指定的名字空间,要么是当前的名字空间. 

[python]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. user=> (symbol 'foo)  
  2. foo  
  3. user=> (symbol "foo")  
  4. foo  
  5. user=> (symbol "clojure.core" "foo")  
  6. clojure.core/foo  
  7. user=> (symbol "abc def")  
  8. abc def  
  9. user=> (symbol "abcdef")  
  10. abcdef  
  11. user=> (symbol nil)  
  12. java.lang.NullPointerException (NO_SOURCE_FILE:0)  
  13. user=> (symbol 0)  
  14. java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String (NO_SOURCE_FILE:0)  

二、用法:  

name: name函数接受一个参数,如果该参数为字符串,则直接返回该参数。如果不是字符串,则返回名称值。代码如下: 

[python]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. user=> (name :foo)  
  2. "foo"  
  3. user=> (name 'foo)  
  4. "foo"  
  5. user=> (name "foo")  
  6. "foo"  
  7. user=> (name nil)  
  8. java.lang.NullPointerException (NO_SOURCE_FILE:0)  
  9. user=> (name 0)  
  10. java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.Named (NO_SOURCE_FILE:0)  

intern: intern函数有两个实现:(intern ns name)、(intern ns name val)。 

根据命名空间ns中查找是否存在符号name,不存在,则创建;最有一个参数val作为值与符号进行绑定,代码如下: 

[python]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. user=> (intern 'user 'x)  
  2. #'user/x  
  3. user=> x  
  4. java.lang.IllegalStateException: Var user/x is unbound. (NO_SOURCE_FILE:0)  
  5. user=> (intern 'user '"1")  
  6. #'user/x  
  7. user=> x  
  8. "1"  

namespace: namespace函数根据给定的符号、或者关键字返回所在的命名空间名称,如果当前没有,则返回nil,代码如下: 

[python]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. user=> (symbol 'xx)  
  2. xx  
  3. user=> (namespace 'user/xxx)  
  4. "user"  
  5. user=> (namespace 'xxx)  
  6. nil  
  7. user=> (def x :val)  
  8. #'user/x  
  9. user=> (namespace 'x)  
  10. nil  
  11. user=> (namespace 'user/x)  
  12. "user"  

三、检查:  

keyword?、symbol?用于检查指定的参数是否为关键字、或者是符号,是则返回true,否则返回false。 

[python]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. user=> (symbol? 'x)  
  2. true  
  3. user=> (symbol? "x")  
  4. false  
  5. user=> (keyword? 'x)  
  6. false  
  7. user=> (keyword? :x)  
  8. true  
  9. user=> (keyword? "x")  
  10. false