9

XMLからインスタンスscala.xmlを取得するために、ライブラリがどのように実装されているのか疑問に思っています。Elem

だから私は書くことができます:

val xml = {
  <myxml>
    Some wired text withoud "'s or code like
    import x
    x.func()
    It's like a normal sting in triple-quotes.
  </myxml>
}

xml.text

String = 
 "
    Some text wired withoud "'s or code like
    import x
    x.func()
    It's like a normal sting in triple-quotes.
  "

ソースコードを見ても、これがどのように達成されているかについての洞察は得られませんでした。「XML 検出」は (ハード) スカラ言語機能ですか、それとも内部 DSL ですか? 私はこのように自分のものを作りたいので:

var x = LatexCode {
  \sqrt{\frac{a}{b}}
}

x.toString

"\sqrt{\frac{a}{b}}"

また

var y = PythonCode {
  >>> import something
  >>> something.func()
}

y.toString
"""import something ..."""

y.execute  // e.g. passed to python as python-script

また

object o extends PythonCode {
  import x
  x.y()
}

o.toString

"""import x...."""

PythonCode { """import ...""" }「DSL」などの使用は避けたいと思います。そして scala では、XML は魔法のようにscala.xml-Class に転送されます。Symbolで取得できるものと同じval a = 'symoblnameですが、ソースコードでは、これがどのように実装されているかわかりません。

できれば内部DSLとして、どうすれば自分でそのようなことを行うことができますか?

4

2 に答える 2

11

XML はスカラ言語の機能です (*) - SLSのセクション1.5を参照してください。

ただし、文字列補間は 2.10 で導入されると思いますが、これにより、少なくとも独自の DSL を定義できるようになります。

val someLatex = latex"""\sqrt{\frac{a}{b}}}"""

これは、SIP でより完全に説明されている実験的な機能ですが、多作の Daniel Sobral によってさらにブログで紹介されています。これのポイントは、(もちろん) String 内のコードの正確性がコンパイル時にチェックできることです (まあ、型指定されていない言語で可能な範囲で:-) そして、IDE はそれを書くのを助けることさえできます (まあ、型付けされていない言語で可能な限り:-( )

(*) -実装には多くの欠点があるため、これは将来変更される可能性があります。私の理解では、文字列補間とアンチ xml の組み合わせが、まだ 1 つの真の方法である可能性があります

于 2012-08-28T13:01:53.300 に答える
3

"foo"これは、文字列リテラル、42整数リテラル、12.34浮動小数点リテラル、'fooシンボルリテラル、(foo) => foo + 1関数リテラルなどと同じように、XMLリテラルです。

Scalaは他の言語よりもリテラルが少ないですが(たとえば、配列リテラルや正規表現リテラルはありません)、XMLリテラルはあります。

Scala 2.10では、文字列リテラルは、sを使用してそれらをインターセプトおよび再解釈できるようにすることで、はるかStringContextに強力になることに注意してください。これらのより強力な文字列リテラルを使用すると、個別の言語をサポートせずにXMLを含むすべてのスニペットを実装できます。XMLリテラルは、この言語の将来のバージョンで削除される可能性があります。

于 2012-08-28T13:24:59.557 に答える