2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C++を日本語で書く方法

Posted at

はじめに

 まずは以下のコード1を見てください。
 最初の#includeやら標準出力に左シフトしているところやらがC++風味ではありますが、一体これは何でしょうか……?

#include "stdafx.h"
#include "japanese.h"
#include "japanese_std.h"
#include <iostream>

クラス ほげ とは、
以下公開 :
	整数型 ほげメンバ 

	コンストラクタ ほげ は引数を取らない 

	コンストラクタ ほげ は引数として ほげ の不変型 への参照 ホゲ を取り、
	初期化するのは ほげメンバ  ホゲ のメンバ ほげメンバ でであり、
	挙動は
		標準名前空間 にある 標準出力 を左シフト "ほげコピーコンストラクタ" を左シフト 標準名前空間 にある 改行 
	以上 

	インライン最適化しうる デストラクタ ほげ は引数を取らず、
	挙動は
		標準名前空間 にある 標準出力 を左シフト "ほげデストラクタ" を左シフト 標準名前空間 にある 改行 
	以上 

	クラス ほげ への参照 を返す 演算子  は引数として ほげ の不変型 への参照 ホゲ を取る 
以上 

ほげ にある ほげ は引数を取らず、
初期化するのは ほげメンバ  0 でであり、
挙動は
	標準名前空間 にある 標準出力 を左シフト "ほげデフォルトコンストラクタ" を左シフト 標準名前空間 にある 改行 
以上 

クラス ほげ への参照 を返す ほげ にある 演算子  は引数として ほげ の不変型 への参照 ホゲ を取り、
挙動は
	このインスタンスのメンバ ほげメンバ  ホゲ のメンバ ほげメンバ 
	標準名前空間 にある 標準出力 を左シフト "ほげ代入演算子" を左シフト 標準名前空間 にある 改行 
	返り値は このインスタンス 
以上 

クラス ぴよ の挙動は ほげ であって、
以下公開 :
	コンストラクタ ぴよ は引数を取らず、 初期化するのは ほげ を引数なしでであり、
	挙動は
		標準名前空間 にある 標準出力 を左シフト "ぴよデフォルトコンストラクタ" を左シフト 標準名前空間 にある 改行 
	以上 
以上 

整数型 を返す メイン関数() とは、
	ほげ へのポインタ型 ほげ配列ポインタ  新たに ほげ  5 要素の配列を確保する 
	ほげ ホゲ  ほげ配列ポインタ  0 番目 
	最初は 整数型   0 で条件   5 を満たす間  をインクリメント をしながら
		ほげ配列ポインタ   番目  ホゲ 
	以上を繰り返す 
	確保した配列 ほげ配列ポインタ を解放する 
	返り値は 0 
以上 

こたえあわせ

 かつてのVisual Studio(確かVS2010とかの頃)ではマルチバイト文字対応が中途半端に実装されていて2、以下のようなヘッダーファイルをincludeすると普通にコンパイルが通りました(japanese_std.hに関しては省略)

japanese.h
#if !defined(JAPANESE_H)
#define JAPANESE_H

#define 。 ;
#define 、 ,
#define : :
#define を返す
#define にある ::
#define とは、 {
#define 無名の

#define 返り値のない void
#define 符号なし unsigned
#define 符号つき signed
#define 文字型 char
#define 整数型 int
#define 短整数型 short
#define 長整数型 long
#define 長々整数型 long long
#define サイズ型 size_t
#define 単精度浮動小数型 float
#define 倍制度浮動小数型 double
#define 真偽型 bool
#define 真 true
#define 偽 false
#define へのポインタ型 *
#define 汎用ポインタ型 void*
#define の配列 []
#define の [
#define 要素の配列 ]
#define への参照 &
#define への一時変数への参照 &&
#define 型の別名 typedef

#define 命名規則は extern (
#define を使う ) {
#define 以上 }

#define 他の翻訳単位より extern
#define インライン最適化しうる inline
#define 静的な static
#define 最適化を禁止された volatile
#define の不変型 const
#define 不変時にも操作可能な mutable

#define クラス class
#define 構造体 struct
#define 共用体 union
#define 列挙型 enum
#define 何らかの型 typename

#define の挙動は : public
#define また挙動は public
#define の実装手段は : private
#define また実装手段は private
#define ダイヤモンド継承を避けるように virtual
#define であって、 {

#define 以下公開 public
#define 以下継承クラスにのみ公開 protected
#define 以下非公開 private
#define 仮想関数の virtual
#define コンストラクタ
#define デストラクタ ~
#define は引数を取らない ()
#define は引数を取らず、 ()
#define は引数として (
#define を取る )
#define を取り、 )
#define 必ず継承先で実装する = 0
#define 継承されたものである override
#define 継承されたものであり、 override
#define 挙動は {
#define 例外 throw (
#define を投げる )
#define 例外を投げない throw()
#define 初期化するのは :
#define を (
#define で、 ),
#define を引数なしで、 (),
#define でであり、 )
#define を引数なしでであり、 ()

#define 演算子 operator
#define 前置
#define 後置 int

#define 暗黙の型変換に用いない explicit
#define 非公開メンバーも friend
#define からは自由に操作できる

#define このインスタンス (*this)
#define このインスタンスのポインタ this
#define このインスタンスのメンバ this->
#define のメンバ .
#define が示す先のメンバ ->

#define もし if
#define ならば {
#define そうでなければ } else {
#define 最初は if(0) ; else for(
#define 条件 if(0) ; else for(;
#define 永遠に if(0) ; else for(;;
#define 無条件に if(0) ; else for (;;) {
#define で条件 ;
#define で永遠に ;;
#define を満たす間 ;
#define ずっと ) {
#define をしながら ) {
#define 以上を繰り返す }
#define ここから do {
#define ここまで } while (
#define を満たしている間繰り返す )
#define 分岐処理対象 switch (
#define に対して ) {
#define 対象の値が case
#define であれば :
#define どれでもなければ default:
#define 中断 break
#define 当初に戻る continue
#define ここにラベル
#define を設定する :
#define ラベル goto
#define に飛ぶ
#define 返り値は return
#define 例外として throw
#define 例外チェック開始 try {
#define 例外チェック終了 }
#define 例外チェック区間内で catch(
#define が発生したなら ) {
#define 例外チェック区間内でその他の例外が発生したなら catch (...) {
#define 例外チェック区間内で何らかの例外が発生したなら catch (...) {
#define を実行する }

#define 新たに new
#define を確保する
#define 要素の配列を確保する ]
#define 確保した delete
#define 確保した配列 delete[]
#define を解放する

#define 動的に dynamic_cast<
#define 静的に static_cast<
#define 定数性を変更して const_cast<
#define ビットパターンを保持して reinterpret_cast<
#define に >(
#define を変換する )

#define バイト長 sizeof
#define 型識別子 typeid

#define テンプレート template

#define 名前空間 namespace
#define これ以降 using
#define を宣言なしで使える

#define メイン関数 main

#define 番目 ]
#define ポインタを取る &
#define 値を取る *

#define + +
#define - -
#define × *
#define * *
#define ÷ /
#define / /
#define ビットand &
#define ビットor |
#define ビットnot ~
#define ビットxor ^
#define を左シフト <<
#define を右シフト >>
#define ← =
#define に足すのは +=
#define から引くのは -=
#define に掛けるのは *=
#define を割るのは /=
#define インクリメントした ++
#define のインクリメント後の値
#define インクリメントする
#define のインクリメント前の値 ++
#define をインクリメント ++
#define デクリメントした --
#define のデクリメント後の値
#define デクリメントする
#define のデクリメント前の値 --
#define をデクリメント --
#define = ==
#define ≠ !=
#define < <
#define > >
#define ≦ <=
#define ≧ >=
#define かつ &&
#define または ||
#define もしくは ||
#define ∧ &&
#define ∨ ||
#define ¬ !

#endif // JAPANESE_H

感想

 C++の言語仕様に無理やり合わせるために不格好になってはいるものの、それなりに日本語として読める文法を作ることができました。
 やったね! もう十分に日本語プログラミング言語だね!

結論

 こんなプリプロセッサ命令の悪用をするな。

  1. かつて学生だった頃、唐突に思いついて実験的に書いてしまったコードです。

  2. 当時は雑に全角文字が軒並み単語を構成する文字扱いになっていたため、#define 。 ;が普通に通りました。今ではプリプロセッサ命令でもきちんとUnicode文字クラスを用いて記号として判別しているようで、が識別子に使用できないと怒られます。
    一方、もう少し前になると今度は全角文字が識別子として使えなくなるので、あの時代にだけ使えた時代の寵児でした。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?