2012-05-15 44 views
3

可能重複:
「eval」 in ScalaScala代碼數據

廉博士在他的演講http://www.youtube.com/watch?v=LH75sJAR0hc在30分鐘的時候,他開始在Scala中談到實用的風格,他給出了這樣的例子

class Car { 
    def turn(direction: String) = { 
    println("turning " + direction) 
    } 
} 

val car = new car 
car turn "left" 

,然後他說,最後一行可以被理解從數據文件中進行評估。所以,數據變成代碼,代碼變成數據。

如何斯卡拉支持呢?它有eval功能嗎?

+0

聽說過一個哈希表的?將你的字符串命令放在一個散列表中,並將相應的動作(函數)作爲值。 – Marcin

+0

+ Marcin,這是一個實現細節。你還在寫一個口譯員。有很多方法可以做到這一點。 –

+0

@DonStewart我認爲這是語言的濫用來形容每一個接受字符串或令牌來觸發的行爲作爲解釋功能。無論如何,用一流功能的語言來實現這類事情並不是一件簡單的事情。 – Marcin

回答

1

幾乎每一個語言支持的eval功能(甚至強,靜態類型語言比如Haskell)。爲主要通過字節碼解釋實現的語言(如類似Lisp的語言,Erlang或Java)構建的許多語言運行時支持在運行時插入新(字節)代碼的能力。

一旦你可以動態插入新的代碼,你可以寫的eval

Scala是這樣的語言,其中the JVM is available at runtime的一個例子。

即使在沒有完全支持元編程甚至動態鏈接的語言實現中,通常也有通過反射機制或代碼生成支持庫(如LLVM)在程序員控制下動態生成代碼的方法。

不僅僅是一個簡單的一階段的eval,更一般地,支持多級的運算語言允許生成程序從一個階段到下一階段,對階段的任意數目,從而能夠安全地,隨意窩evals 。

背景閱讀

  • 麥卡錫,約翰,History of LISP,SIGPLAN不是。 1978年 - 推出eval
+0

您可以舉一個如何在Scala中動態評估代碼的例子。 – Nabegh

+0

http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/compiler/scala/tools/nsc/interpreter/package.html –

+0

哈斯克爾? EVAL?怎麼樣?醫生,我要去嗎? :) – Rogach