問題タブ [scalac]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
2424 参照

parsing - scalacに行番号がおかしい閉じ中括弧のエラーレポートがありません

私はScalaを学んでいるのでg++、からの不可解な出力を読み取るときにコンパイラエラーを思い出すことがよくありscalacます。g++しかし、今日、私は宇宙でさえ起こるとは思えない何かに出くわしました。

友人から、ごくありふれたエラーのある非常に単純なコードスニペットが送られてきました。

完全なソースファイルはここに掲載されています。クラス宣言に閉じ中括弧がないためcase class Var、コンパイラーは、その宣言の開始中括弧(11行目)に閉じ中括弧がないことを通知すると思います。ただし、前の宣言scalacの途中で閉じ中括弧が欠落していると「想定」していると報告されています(7行目)。case class(完全なエラー出力は、投稿されたコードの下部に含まれています。)

言語の内部を理解していれば、ほとんどのscalacエラーメッセージは意味がありますが、私はここで完全に途方に暮れています。後のクラス宣言で閉じ中括弧が欠落していると、ファイルの前半ですでに正常に解析されたクラス定義にどのように伝播するのでしょうか。

いったいどうやってこれをScalaの初心者に説明するのですか?閉じ中括弧を外すのは、Scalaを初めて使用する人がよく行う間違いのようなものですが、ここでのエラーメッセージは、代わりにそのようなものを報告する方がおそらくより役立つだろうとユーザーを迷わせるように思われますerror: you seem to be missing a '}' somewhere

注:このような質問に対する通常の回答は、「IDEを使用すると、インクリメンタルコンパイルですぐにフラグが立てられます」または「構文の強調表示によってこのエラーが明らかになるはずです」ですが、私の質問はscalac出力について具体的に尋ねているので、どうぞこれらが有効なポイントであることはわかっていますが、ここでコンパイラーで何が起こっているのかを理解したいだけです。

アップデート:

私の混乱を説明するために別のアプローチを試してみましょう。エラーは閉じ中括弧の欠落が原因であるため、中括弧のネストに明らかに問題があります。投稿したスニペットのテキスト(コード)を一連の行番号と中括弧のペアに変換すると、次のようになります。

明らかに、閉じ中括弧がありません。行方不明のブレースがこれらの場所のいずれかに入る可能性があると推測することは理解scalacできました(それぞれがで表されますx):

ただし、これはからの出力がscalac言うことです:

入力のその部分はすでに適切にネストされています!そこに別の閉じ中括弧を追加することは、どのように意味があるのでしょうか?

編集:私は私の主な質問をもう一度繰り返す必要があるように感じます:このエラーメッセージ(およびソースでエラーのルートを見つける方法)をScalaの初心者にどのように説明しますか?

0 投票する
0 に答える
159 参照

scala - ScalaコンパイラプラグインをインストールしてAntで自動的に動作するようにするにはどうすればよいですか?

呼び出されるたびに使用したいScalaコンパイラプラグインを書いているscalacので、Scalaディストリビューションのpluginsディレクトリに置きます(misc/scala-devel/plugins)-これは、のような単純なものを書くと完全に機能しますscalac HelloWorld.scalaが、ビルドしようとすると機能しません次のscalacような埋め込みタスクでAntスクリプトを使用します。

ビルドスクリプトを変更してプラグインディレクトリを指定することで、これを機能させることができます。例:

ただし、手動で変更できないサードパーティのビルドスクリプトで機能するには、これが必要なので、簡単な修正ではうまくいきません。アイデアはありますか?


アップデート:

もう少し掘り下げてみるとpresetdef、たとえば次のように使用してタスク定義をオーバーライドできることがわかりました。

これは問題を直接解決するわけではありませんが、潜在的に興味深いものです-私の現在の調査では、元のスクリプトをインポートするラッパーAntスクリプトにこれ(またはそのようなもの)を入れることができるかどうかです(これが機能するかどうかはわかりませんが、 Antはあまり使いません)。

0 投票する
2 に答える
655 参照

scala - scalac の「-deprecation」および「-unchecked」コンパイラ オプションを使用すると速度が低下しますか

逸話的に、これらのオプションを有効にすると、ビルドが遅くなるように見えます。私はオンラインで少し検索し、いくつかの比較を試みましたが、決定的なものは何も見つかりませんでした. 誰かがオフハンドを知っているかどうか疑問に思います。

0 投票する
1 に答える
702 参照

eclipse - 最適化されないことが保証されている Scala のノーオペレーション?

Scala メソッドの終了時にブレークポイントを設定することはできます}が、ヒットしないため意味がありません。

まだそこに置きたいです。それで、「その行の前に no-op を入れて、そこにブレークポイントを設定するのはどうだろう」と考えました。

しかし、ヒットすることのないブレークポイントを設定しようとしても (そこにはコードがないため) 明らかに Eclipse は警告を出さないので、ノーオペレーションが最適化されているかどうかを Eclipse が教えてくれることに頼ることはできません (特にEclipse Scala プラグインが使用しているのと同じバージョンの Scala を使用してコードを実行していないためです)。

したがって、ここで使用できる短い無操作ステートメントまたは式はありますか?これは、すべての状況で Scala コンパイラによって最適化されないことが保証されています。打たれた上で?このメソッドは ではなく有用な値を返すため、私の場合はステートメントではなく式でなければならないと思いますUnit

0 投票する
1 に答える
679 参照

scala - -Xdisable-assertionsおよび-Xelide-以下のassertをオフにしない

私は現在、SBTを使用しているScalaプロジェクトに取り組んでおり、条件の1つがすべてアサートがオフになっている本番ビルド設定を作成しようとしています。build.sbtに次の行を追加しただけです。

デバッグ時にlogLevelを実行していて、オプションがコンパイラーに渡されているのを確認しましたが、プログラム(長時間実行されているプログラム分析)を実行すると、アサートが発生します。すべての兆候によって、すべての主張はコンパイルされるべきですが。私はこれをdiable-assertionsとelide-belowの両方で試しましたが、結果はありませんでした。誰かが私が間違っていることについていくつかの指針を私に与えることができれば、それは素晴らしいことです。私はたくさんのScalaを書いてきましたが、いくつかの基本的なプロジェクト以外ではSBTをあまり使用していません。

0 投票する
1 に答える
421 参照

scala - クロージャを Scala コンパイラ プラグインに渡す

私は非常に一般的なコード生成を可能にする Scala コンパイラ プラグインを書こうとしています: C プリプロセッサの一般性に似ていますが、もう少しタイプセーフです (これがひどいアイデアかどうかはわかりませんが、楽しい演習です)。 )。私の理想的なユースケースは次のようになります。

重要なプラグイン コードは次のようになります (これに基づく):

これを行う方法はありますか?「マクロを使うだけ」とは言わないでください。少なくとも 2.10 では、十分に一般的ではありません。

ところで、私が概説したアプローチには 2 つの問題があります。1) コンパイラ プラグインは、クロージャではなく AST を取ります。おそらく、ユーザー コードにビルドの依存関係を追加して、クロージャを作成する何らかの方法が必要になります。2) ユーザーは scala.reflect.internal.Trees.Tree にアクセスできず、scala.reflect.runtime.universe.Tree にしかアクセスできないため、プラグインは 2 つの間で変換する必要があります。

0 投票する
2 に答える
478 参照

scala - Scalac 型の不一致が Int を期待するのはなぜですか?

私は昨夜プロジェクトに取り組んでいましたが、次のようなコードがありました。

それから私は誤って次のように書きました:

.と の間を省略してxsいますfoldLeft

問題の型はもう少し複雑で、ラムダのパラメーター型に注釈を付けるように求められたので、それが私の間違いの原因だと考えて、すぐに注釈を付けました。私はこのようなものになりました:

この時点で、次のエラーが表示されました。

明らかに修正は でしたがxs.foldLeft("") ...、この場合、コンパイラがなぜ Int を期待しているのか疑問に思っていました。これがどのように解析されているかを誰かが明らかにできますか? これは一日中私を悩ませています。

0 投票する
1 に答える
334 参照

scala - Travis CI での sbt OutOfMemoryError の修正

ローカルで問題なくビルドできるsbt プロジェクトSBT_OPTS="-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M"があります ( に があるため~/.sbtconfig) が、scala コンパイラはTravis CIでメモリ不足になります。Travis が取得するプロジェクト自体に追加できるプロジェクト固有の設定はありますか?