Skip to content

サンプルコードの拡張記法を使うべき場面について再考 #487

@yumetodo

Description

@yumetodo

動機

サンプルコードの拡張記法が適応されるべき場面について、/reference以下にあるものについては現状のままでも意義はないと個人的には思っているのですが、/lang以下などについては十分に議論がなされなかったと思っています。

#473 では後述の通り @faithandbrave さんが唐突に

「インクルードとmain関数を含む完全なコードのコードブロック」に対して付ける

という方針を出されて、 #473 がcloseされたのでそれがルールになったわけですが、

cpprefjp/kunai#69

で横道にそれて問題になったのが

https://cpprefjp.github.io/lang/cpp17/remove_deprecated_increment_of_bool.html

にある次の2つのソースコードです。

int main(void)
{
  int flag = 0;
  /* do something */
  if(flag){
    /* do something when flag is true*/
  }
  return 0;
}
#include <iostream>
#include <vector>
int main()
{
  std::vector<int> v{};
  //append elements to v
  int flag = 0;
  for(auto&& i : v){
    if(flag++) std::cout << ',';
    std::cout << i << std::endl;
  }
}

いずれも

「インクルードとmain関数を含む完全なコードのコードブロック」に対して付ける

というルールには合致し、また合法なコードですが、実行されるべきではないと考えます。理由は、前者では変数flag、後者では変数v状態がどうなっているかわからないことに前提をおいた説明をしたいのであって、実行したところで意味のある出力を産まず、またそうなるように書き換えると説明がわかりにくくなるからです。

サンプルコードの拡張記法の経緯

サンプルコードの拡張記法は、サンプルコードを実行可能にする機能を実装する際に、何を実行可能かを自動判定するのは無理があるということで、 cpprefjp/site_generator#30 で複数のsyntaxが検討された後、CommonMarkに準拠した

```cpp example
int a = 42;
std::string s = "ほげほげ";
```

のような記法が導入することが #473 のCloseを持って決定されました。

これによって
cpp example(書かれていないけど多分 c exampleも対象ですよね? @saki7 => cpprefjp/kunai#70 )と書かれたコードブロック=実行可能
にすることになりました。

ここまでの議論で出てきたサンプルコードの拡張記法を使うべき場面に関する言及

cpprefjp/site_generator#30 では

cpprefjp/site_generator#30 (comment) by @yumetodo
cpp:exampleというよりcpp:runnableかと。サンプルコードでもコンパイルが通らないものもあるし、コンパイル・実行可能かを示すべきでは

cpprefjp/site_generator#30 (comment) by @saki7
runnable かどうかは定性的に判断できないので、もっとゆるふわな表現の方が僕は好きです。

cpprefjp/site_generator#30 (comment) by @yumetodo
runnableというかwell-formedか。

well-formedか否かは判別できるはず

cpprefjp/site_generator#30 (comment) by @faithandbrave
すいません、ここでの実行可能とは、Wandboxで実行可能、という理解であっていますか?
たとえば今後ネットワークライブラリが入った場合、(DDoSの踏み台にならないように) Wandboxでは動かないようにするのが正しいかと思いますが 、「インクルードとmain関数を含んだ完全なコード」であることと、「Wandboxで動く」ことでは隔たりがあるのではないかと思います。
これは、コード抽出のためのタグ付けと、フロントエンドのWandbox連携のためのコード抽出では、分けて考えておいたほうがいいのでは、という意図です。
単に「実行可能」であることをタグ付けしちゃうと困りそうだなと。

cpprefjp/site_generator#30 (comment) by @yumetodo

すいません、ここでの実行可能とは、Wandboxで実行可能、という理解であっていますか?

それもあって

runnableというかwell-formedか。

と発言しました。

cpprefjp/site_generator#30 (comment) by @saki7
※僕もアキラさんの意見に賛成で、「例」以下のコードブロックで動かないものがあれば、記事側を直した方が良いという認識です。
※つまるところ、 runnableかどうかはこのIssueの範囲では問題にしていないということです。

cpprefjp/site_generator#30 (comment) by @faithandbrave
あまり新ルールを入れると、コントリビューターの参入障壁が上がるのでルールは少ないほうがよい、というのが基本的な考えです。
ですので、cpprefjpに限っては## 例の下にあるcppコードブロックを探せば全てのページで解決できるからパーサーをがんばればよさそう、と思うのですが、これがboostjpを視野に入れたものであればタグ付けは必要かと思います。

cpprefjp/site_generator#30 (comment) by @saki7
僕も site に仕様変更を入れないで済む可能性も含めて色々考えたのですが、仰るように boostjp もできれば綺麗にしたいですし、 cpprefjp の範囲でも article/ 以下の記事は既にサンプルコードの検知で限界が来ています。なので、僕はやはりcpp exampleは必要という結論に至りました。

とその議論はこのIssueの範疇ではないということで議論が途切れて別の話になっています。

ところが

#473 (comment) by @faithandbrave
cpp exampleを書く場所ですが、基本的には「インクルードとmain関数を含む完全なコードのコードブロック」に対して付けます。
例外は、翻訳単位のようなものの説明のために、コードが分割されているようなケースです。

pthreadライブラリのような環境依存のライブラリを使用しているコードであっても、cpp exampleにしてもらって大丈夫です。

とどこからともなく「インクルードとmain関数を含む完全なコードのコードブロック」に対して付けるという方針が出てきました。(当時私は見落としていた)

私が見落としていたとは言え #473 で否定意見が出なかったことは確かなので、ガイドラインとして機能しています。

提案内容

「例」の項に書かれたコードについてはすべて実行可能であるべきだという点については現状のルールの意図するところで、拡張記法導入の経緯の議論からいってもいいと思うのですが、それ以外の項のコードについてはたとえmain関数があってコンパイルが通るものでも編集者のよきように、でいいんじゃないかなと思います。厳密にルールを決めるのは難しいので。

well-formedではないものについては先の議論では否定的な意見でしたが、

cpprefjp/kunai#69 (comment) by @faithandbrave
Wandboxで実行することで、実際にコンパイルエラーになることを確認できるので、それも実行可能にしたほうがよいかと思います。

というのもわからなくはないので、やはりこれも編集者が説明に都合がいいコンパイルエラーが出ていたら実行可能にしてもいいことに、ということで編集者のよきように、でいいんじゃないかなと思います。説明に関係ないエラーが出ることが避けられない場合もあると思うので。

ルール変更時の作業内容

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions