是否有在Clojure中测试文字的功能?

时间:2014-01-19 05:21:20

标签: clojure

我看到了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')*)? ;

2 个答案:

答案 0 :(得分:3)

文字是compile time概念(即将文字解析为对应的值/对象由编译器完成),其中函数为runtime concept(即它们处理运行时可用的值) ),所以,没有这样的功能可能,因为函数将无法检查值/对象是否是文字编译的结果。 只有一个宏可以说某事是否是字面意思。

答案 1 :(得分:1)

不,Clojure中没有这样的功能。

有很多种文字,包括复合集合,如地图,集合,向量,列表等,所以我不确定“文字?”实际上是一个有意义的问题。