如何将字符串从文本输入转换成一个功能在斯卡拉(How to convert a string fro

2019-10-17 12:06发布

我创建使用Scala的一个GUI应该发挥依赖于算法,但到文本字段,如一个信号。 SIN(2 * PI * 400 * T)。 该播放功能完美地工作,但问题是图形用户界面的输入。 文本字段需要的功能,并将其转换为字符串,现在我想知道是否有将字符串转换回功能的简单方法。 我正在考虑匹配输入各种有效的功能,但是我并不想限制可能的功能,我希望用户更创造

我还是比较新的斯卡拉,希望你们其中一个人有一个更好的主意。 这里是我到目前为止,它的一个基本的设置侧重于功能的代码。

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)
    }
  }
}

Answer 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"
}


文章来源: How to convert a string from a text input into a function in a Scala