2017-07-07 28 views
0

私は単純なダンプダウンの例があります。私は、さまざまなサーバーからパラメータとその値を格納するための小道具テンプレートを持っています。プロパティ値は、Stringまたはnumeric(IntegerまたはFloat)のいずれかです。現在、システムからプロパティーを読み取る "コレクター"は、列値をStringとしてファクトを生成します。文字列を浮動小数点に変換する方法

(deftemplate prop (slot serverid) (slot name) (slot value)) 
(assert (prop (serverid "ppn45r07vm_0") (name "email.encoding") (value "utf-8"))) 
(assert (prop (serverid "ppn45r07vm_0") (name "inventory.safety.threshold") (value "99.0"))) 
(assert (prop (serverid "ppn45r55vm_0") (name "inventory.safety.threshold") (value "993.1"))) 

(defrule check-range 
    (prop (serverid ?s) (name "inventory.safety.threshold") (value ?v)) 
    (test (> (float ?v) 100.0)) 
=> 
    (printout t "safety threshold on server " ?s " is set too high at " ?v crlf) 
)  

私の質問 - 私は範囲チェックを実行できるように、どのように私はfloatまたは整数値のいずれかに文字列値を変換しない、などJESSで作品上記のサンプルコードJESSのフロート機能は、文字列になりますので、 Floatを返します。 CLIPSのfloat関数は数値をとり、floatを返します。私はStringをFloatに変換する同様のCLIPS関数を見つけることができませんでした。明白な答えがあるかどう

ただ完全を期すために、クリップでは、私は次のようなエラーに

CLIPS> (defrule check-range 
    (prop (serverid ?s) (name "inventory.safety.threshold") (value ?v)) 
    (test (> (float ?v) 100.0)) 
=> 
    (printout t "safety threshold on server " ?s " is set too high at " ?v crlf) 
)  
[ARGACCES5] Function float expected argument #1 to be of type float 

[DRIVE1] This error occurred in the join network 
    Problem resides in associated join 
     Of pattern #1 in rule check-range 

[ARGACCES5] Function float expected argument #1 to be of type float 

[DRIVE1] This error occurred in the join network 
    Problem resides in associated join 
     Of pattern #1 in rule check-range 

謝罪を取得します。助けを前にありがとう。

答えて

2

あなたは、文字列とジェスと同様の動作を得るためにフロート機能をオーバーロードすることができます

CLIPS> (float "3") 
[ARGACCES5] Function float expected argument #1 to be of type integer or float 
CLIPS> 
(defmethod float ((?s STRING)) 
    (float (string-to-field ?s))) 
CLIPS> (float "3") 
3.0 
CLIPS> 
+0

恐ろしい - 作品!ありがとう。 – Bernie

関連する問題