1

我正在使用 Scala 创建一个 GUI,它应该播放一个依赖于算法但进入 textField 的信号,例如。罪(2*Pi*400*t)。播放功能完美运行,但问题是 GUI 的输入。textField 接受函数并将其转换为字符串,现在我想知道是否有一种简单的方法可以将字符串转换回函数。我正在考虑将输入与各种有效功能相匹配,但是我不想限制可能的功能,因为我希望用户更有创造力

我对 Scala 还是比较陌生,希望你们中的一个人有更好的主意。这是我到目前为止的代码,它是一个专注于功能的基本设置。

object PlayApp extends SimpleGUIApplication {
  def top = new MainFrame {
    title = "Play Function App"
    val label = new Label("Type in function to be played")

    object Function extends TextField ( columns = 10)
    val label2 = new Label("Type in length of time to play")
    object Time extends TextField { columns = 10}  
    val button = new Button("Play")

    contents = new BoxPanel(Orientation.Vertical) {
      contents += label
      contents += Function
      contents += label2
      contents += Time
      contents += button
      border = Swing.EmptyBorder(50, 50, 20, 50)
    }

    var f = "sin(t)"
    var x = 0

    listenTo(Function, Time, button) 
    reactions += {
      case EditDone(Function) =>
        f = Function.text.toString
      case EditDone(Time)     =>
        x = Time.text.toInt
      case ButtonClicked(b)   =>
        play(t => f.toDouble,0,x)
    }
  }
}
4

1 回答 1

1

您想编译用户输入的代码行,并带有一些有用的序言。

我没有这样做,所以我没有方便的片段(但尝试搜索),但您可以嵌入 REPL,让它编译代码行,然后提取结果。

这是一个使用 ILoop 获取一些输出的片段,但是您想使用 IMain 来获取结果类的结果,该结果类包装了用户函数。

import scala.tools.nsc.interpreter.ILoop
import java.io.StringReader
import java.io.StringWriter
import java.io.PrintWriter
import java.io.BufferedReader
import scala.tools.nsc.Settings

object FuncRunner extends App {

  val line = "sin(2 * Pi * 400 * t)"

  val lines = """import scala.math._
    |var t = 1""".stripMargin

  val in = new StringReader(lines + "\n" + line + "\nval f = (t: Int) => " + line)
  val out = new StringWriter

  val settings = new Settings

  val looper = new ILoop(new BufferedReader(in), new PrintWriter(out))
  val res = looper process settings
  Console println s"[$res] $out"
}
于 2012-12-20T06:55:52.880 回答