我看到了number?
和string?
等功能。
是否有函数来测试表单是否为文字?
我指的是Clojure中的所有文字。
这就是我想要做的。
;;抽象语法表示
(defrecord VarExp [id])
(defrecord LiteralExp [datum])
(defrecord LambdaExp [ids body])
(defrecord IfExp [pred true-exp false-exp])
(defrecord AppExp [rator rands])
(defn parse-expression [datum]
(cond
(symbol? datum) (VarExp. datum)
(literal? datum) (LiteralExp. datum)
(list? datum) (cond
(= (first datum) 'fn) (LambdaExp. (map parse-expression (second datum))
(parse-expression (nth datum 2)))
(= (first datum) 'if) (IfExp.
(parse-expression (second datum))
(parse-expression (nth datum 2))
(parse-expression (last datum)))
:else (AppExp.
(parse-expression (first datum))
(map parse-expression (rest datum))))
:else (throw
(Exception. (str 'parse-expression
": Invalid concrete syntax " datum)))))
我想在不使用任何独立解析器的情况下将S-exp解析为AST,因为s-exp非常类似于解析树。
我目前的解决方案是:
(defn literal? [datum]
(or
(true? datum)
(false? datum)
(string? datum)
(nil? datum)
(symbol? datum)
(number? datum)))
这是最实用的吗?
顺便说一下,这是Clojure的语法 文字 :STRING |数 |字符 |零 |布尔 |关键词 |符号 | PARAM_NAME ;STRING:'''(〜'“'|'\''”')*'“';
NUMBER:' - '? [0-9] +('。'[0-9] +)? ([eE]' - '?[0-9] +)? ;
字符:'\'。 ;
NIL:'nil';
BOOLEAN:'true'| 'false';
KEYWORD:':'SYMBOL;
符号:'。' | '/'| NAME('/'NAME)? ;
PARAM_NAME:'%'(('1'..'9')('0'..'9')*)? ;
答案 0 :(得分:3)
文字是compile time
概念(即将文字解析为对应的值/对象由编译器完成),其中函数为runtime concept
(即它们处理运行时可用的值) ),所以,没有这样的功能可能,因为函数将无法检查值/对象是否是文字编译的结果。
只有一个宏可以说某事是否是字面意思。
答案 1 :(得分:1)
不,Clojure中没有这样的功能。
有很多种文字,包括复合集合,如地图,集合,向量,列表等,所以我不确定“文字?”实际上是一个有意义的问题。