1

Scala を使用して GUI を作成しています。これは、アルゴリズムに依存するが textField に信号を再生する必要があります。sin(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 に答える