2

Opa DocumentationのHello-wikiコードを編集しています。ウィキ トピックに、データベース内の既存のトピックのリストが必要です。デフォルトのトピックで呼び出される関数があります。

/**
  * Collect all created topics from /wiki 
  * and present them in Markdown format
  */
function collect_topics(page) {
    string collection = "#Available topics\n"

    // Format as a list
    Set.iter(function( topic ) {
        collection = "{collection} *[{topic}](./{topic})\n"
    }, [/wiki])

    save_source(page, collection)
}

...

function start(url) {

    match (url) {

        case {path: [] ... } :
            { collect_topics("Topics") };

        case {~path ... } :
            { display(String.capitalize(String.to_lower(String.concat("::", path)))) };
    }
}

これにより、構文エラーが発生します。文字列は不変であるため、私の理解では、「条件としてバインディングが見つかりました」です。作成した文字列を変更する方法はありますか? 例えば:

string x = "foo"
x = x ^ x

これが不可能な場合、より良いアプローチは何でしょうか?

4

1 に答える 1

4

実際、Opa は関数型プログラミング言語であり、値は可変ではありません。本当に変更可能な値が必要な場合は、http://doc.opalang.org/module/stdlib.core/Mutableまたは Cells を使用して、アプリの状態を (安全な更新で) 処理しますhttp://doc.opalang.org/value /stdlib.core.rpc.core/Cell/make

コードの書き方は次のとおりです。

function collect_topics(page) {

    collection =
        Map.fold(function( key, value, acc ) {
            "{acc}\n *[{key}](./{value})"
        }, /wiki, "#Available topics\n")

    collection
}

ここでは、Set.iter の代わりに Set.fold を使用します。List.fold ドキュメントは、"fold" 関数がどのように機能するかを理解するのに役立ちます: http://doc.opalang.org/value/stdlib.core/List/fold

Set.iter は何も返しません (void)。コレクションを反復処理し、コンソールにログを出力したり、Dom を変更したりするなど、いくつかの副作用を実行するためにのみ使用されます。

于 2012-05-09T08:54:06.903 に答える