WHAT'S NEW
- 2024/10/25 簡単なベンチマークを改訂
- 2024/08/31 Scheme Junk Scripts を削除
- 2024/08/30 Yet Another Scheme Problems のスタイルシート (CSS) を変更
- 2024/08/22-29 お気楽 Scheme プログラミング入門のスタイルシート (CSS) を変更
CONTENTS
お気楽 Scheme プログラミング入門と Yet Another Scheme Problems のフォントを Web フォント (Noto Sans JP, Noto Sans Mono) に変更し、印刷用の CSS を追加しました。Web ブラウザの印刷機能を使って PDF に変換することもできます。表示が崩れるときはフォント Noto Sans Mono CJK JP をインストールしてください。
お気楽 Scheme プログラミング入門
CONTENTS
●入門編
- 2020/08/23 Scheme の基礎知識 [1]
Scheme はリストが主人公、リストの構造、関数の実行、シンボルと文字列、式の計算、複雑な式を計算する、関数とプログラミング、関数定義、変数とは?、まとめ、問題
- 2020/08/23 Scheme の基礎知識 [2]
変数への代入、局所変数と大域変数、評価しちゃだめ、基本的なリスト操作、ドット対とドットリスト、リストの分解と合成、リストの操作は非破壊的、まとめ、問題
- 2020/08/30 Scheme の基礎知識 [3]
条件分岐、述語、複数の術語を組み合わせる、when と unless、数と算術演算、再帰定義、再帰定義とリスト操作、型述語、まとめ、問題
- 2020/08/23 Scheme の基礎知識 [4]
let による局所変数の定義、累乗の計算、累乗の高速化、複雑な条件分岐、繰り返し、末尾再帰、リストの反転、フィボナッチ関数、名前付き let、繰り返しと再帰定義、まとめ、問題
- 2020/08/30 数当てゲーム [1]
乱数のお話、線形合同法、1 から 100 までの乱数を生成する、データの入力、ゲーム本体の作成、等値関係を調べる述語、ゲームの実行、まとめ、プログラムリスト、問題
- 2020/08/30 数当てゲーム [2]
マスターマインド、数字を 4 つ選ぶ、入力処理を作る、文字型データ、bulls を数える、cows を数える、ゲーム本体を作る、ゲームの実行、まとめ、プログラムリスト
- 2020/08/30 Scheme の入出力 [1]
標準入出力とは?、出力、format、入力、read-line、ファイル入出力、call-with-input-file と call-with-output-file、コマンドラインからパラメータを受け取る方法、まとめ
- 2020/08/30 Scheme の入出力 [2]
平均値と標準偏差、ファイルを行単位で連結する、オプションの取得、行番号を表示する、文字列ポート、バイナリポート、まとめ、プログラムリスト、問題
- 2020/08/30 Scheme プログラミング中級編 [1]
高階関数、マップ関数、マップ関数の作成、フィルター、畳み込み、畳み込みの応用例、apply、ラムダ式、リストの探索、連想リスト、まとめ、問題
- 2020/08/30 Scheme プログラミング中級編 [2]
局所変数の有効範囲 (レキシカルスコープ)、ダイナミックスコープ、ラムダ式と局所変数、高階関数とラムダ式、ラムダ式とクロージャ、関数を生成する関数、カリー化、ジェネレータ、乱数ジェネレータ、問題
- 2020/08/30 Scheme プログラミング中級編 [3]
配列、ベクタの基本的な操作、ベクタの連結とコピー、ベクタの破壊的な操作、ベクタの変換、ベクタの高階関数、do、線形探索と畳み込み、二分探索、ソート (挿入ソート)、バイトベクタ、バイトベクタを使ったファイルの入出力、まとめ
- 2020/09/19 Scheme プログラミング中級編 [4]
リスト構造の修正、リストの連結、リストの反転、リストによるキューの実装、可変個引数、case-lambda、循環リスト、循環リストのチェック、循環リストによるキューの実装、まとめ
- 2020/09/06 二分木
木、二分木、レコード型、節の構造、データの探索、データの挿入、データの削除、巡回、二分木の操作関数、実行例、プログラムリスト
- 2020/09/06 ヒープとハッシュ法
ヒープ、ヒープの構築 (1)、ヒープの再構築、ヒープの構築 (2)、優先度付き待ち行列、実行例、プログラムリスト1、ハッシュ法、ハッシュ法の仕組み、チェイン法、ハッシュ表の定義、データの探索、データの挿入、データの削除、巡回、実行例、プログラムリスト2
- 2020/09/06 集合としてのリスト
集合、union、intersection、difference、exclusive-or、subset?、adjoin、ライブラリの作成、プログラムリスト
- 2020/09/06 経路の探索
グラフとは?、隣接行列と隣接リスト、連想リストによる方法、バックトラックによる探索 (深さ優先探索)、幅優先探索、経路の管理、プログラムの作成、反復深化、反復深化による経路の探索、プログラムリスト1、プログラムリスト2
- 2020/09/06 継続と継続渡しスタイル
継続とは?、継続渡しスタイルとは?、再帰呼び出しと継続渡しスタイル、二重再帰と継続渡しスタイル、継続渡しスタイルの便利な使い方、継続、大域脱出、繰り返しの中断、再帰呼び出しからの脱出、letrec、イテレータ、イテレータを生成する関数
- 2020/09/12 マクロ
C言語のマクロ、伝統的なマクロ、マクロとコンパイラの関係、スタックの操作、スタックを操作するマクロ、準クオート、伝統的なマクロの問題点 (1) (2)、マクロの再帰定義、健全なマクロ、伝統的なマクロとの違い (1) (2)、識別子の使い方、マクロの再帰定義、健全なマクロの弱点
- 2020/09/19 多値
call-with-values と values、let-values と let*-values、define-values、クイックソート、クイックソートの弱点、多値と継続渡しスタイル、多値と継続
- 2020/09/19 例外
例外処理、例外の捕捉、例外の送出、file-error? と read-error?、with-exception-handler
- 2020/09/19 メモ化と遅延評価
たらいまわし関数、メモ化による高速化、メモ化関数、遅延評価による高速化、クロージャによる遅延評価、プログラムリスト 1, 2
- 2020/09/30 便利なリスト操作関数
iota と tabulate、take と drop、マッピング、フィルター、畳み込み、解きほぐし (逆畳み込み)、リストの探索、any と every、ライブラリの作成、プログラムリスト
- 2020/09/30 便利なベクタ操作関数
ベクタの生成、ベクタの破壊的操作、マッピング、畳み込みと巡回、ベクタの述語、ベクタの探索、ベクタのソート、プログラムリスト 1, 2
- 2021/10/23 複素数
Scheme の数、無限大、負のゼロ、非数、Scheme の複素数、数の型述語、複素数の四則演算、複素数の指数関数と対数関数、複素数の三角関数、複素数の双曲線関数、複素数の平方根、逆三角関数、複素数の逆三角関数
●応用編
- 2020/10/04 遅延ストリーム (1)
遅延ストリームの構造、遅延ストリームの生成、リストと遅延ストリームの変換、遅延ストリームの操作関数、遅延ストリームの連結、高階関数、stream-map の便利な使い方、stream-flatmap、stream-take-while と stream-drop-while、エラトステネスの篩、より高速な方法
- 2020/10/04 遅延ストリーム (2)
遅延ストリームの併合、集合演算、ハミングの問題、順列の生成、8クイーンの解法、木の巡回と CPS、木の巡回と遅延ストリーム、ツリーマッチング、プロミスを使わずに遅延ストリームを実装する、プログラムリスト 1, 2
- 2020/10/11 遅延ストリーム (3)
遅延ストリームをプロミスで表す、stream-delay、実行速度の比較、問題点、プログラムリスト、簡単な実行例
- 2020/10/11 非決定性
amb の動作、関数版 amb の作成、解をすべて求める、論理パズル、マクロ版 amb の作成、地図の配色問題
- 2020/10/11 非決定性 (2)
amb は深さ優先探索、経路の探索、幅優先探索版 amb の作成、水差し問題、反復深化、do、反復深化による経路の探索、反復深化による水差し問題の解法、積木の移動
- 2020/10/11 コルーチン
コルーチン、コルーチンの動作、コルーチンの作成、簡単なテスト、高階関数をジェネレータに変換、順列の生成、エラトステネスの篩
- 2020/10/11 部分継続
部分継続、イテレータを生成する関数、部分継続によるコルーチンの実装、継続による部分継続の実装、部分継続によるバックトラックの実装
- 2020/10/11 コルーチン (2)
並行プログラミングとは?、簡単なマルチプロセスの作成、簡単な実行例、キューによる同期処理、哲学者の食事、実行結果 (1)、デッドロックの防止、実行結果 (2)、デッドロックの防止 (2)、実行結果 (3)
- 2020/10/11 記号のパターンマッチング
パターンマッチング、パターン変数は連想リストで管理する、match の実装、ユニフィケーション、unify の実装、プログラムリスト、Prolog ライクなユニフィケーション
●思考ルーチン編
- 2020/10/18 ミニマックス法と三目並べ
ゲームの木、ミニマックス法、三目並べ、プログラムの作成、勝敗の判定、先手の指し手、後手の指し手、初手の評価値を求める、実行結果、戦略に基づいたプレイ、プログラムの作成 (2)、実行結果 (2)
- 2020/10/18 アルファベータ法とミニミニリバーシ
ミニミニリバーシ、盤面のデータ構造、反転する石を求める、ミニマックス法のプログラム、実行結果、アルファベータ法、アルファベータ法のプログラム、実行結果 (2)、探索順序の変更
- 2020/10/18 ネガマックス法とネガアルファ法
ネガマックス法、ネガアルファ法、ネガアルファ法の改良、プログラムの作成、実行結果
- 2020/10/18 ネガスカウト法
ミニミニリバーシ変形版、プログラムの修正、実行結果、null window search、ネガスカウト法、プログラムの作成、実行結果 (2)
- 2020/10/18 置換表と MTD(f) 法
置換表とは?、ネガマックス法と置換表、プログラムの作成、実行結果、アルファベータ法と置換表、実行結果 (2)、MTD(f) 法、実行結果 (3)
●パズルの解法
- 2020/09/06 順列と組み合わせ
順列の生成、バックトラック法の実装、プログラムの作成、高階関数版の作成、順列をリストに格納する、要素の選択、順列をリストに格納する (2)、組み合わせの数、パスカルの三角形、組み合わせの生成 (1)、組み合わせをリストに格納する、組み合わせの生成 (2)、問題
- 2020/09/12 パズルの解法 [1]
8 クイーン、斜めの利き筋のチェック、8 クイーンの解法、プログラムの高速化、プログラムリスト1、マスターマインド、推測アルゴリズム、プログラムの作成、何回で当たるか、プログラムリスト2
- 2020/09/12 パズルの解法 [2]
8パズルの説明、幅優先探索による解法、実行結果、プログラムリスト1、双方向探索、プログラムリスト2、最長手数の求め方、プログラムの作成、実行結果、プログラムリスト 3, 4, 5
- 2020/09/12 パズルの解法 [3]
ペグ・ソリテア、Hoppers、跳び先表とペグの移動、反復深化による Hoppers の解法、実行結果、プログラムリスト1、反復深化による 8 パズルの解法、実行結果、下限値枝刈り法、下限値枝刈り法のプログラム、実行結果、プログラムリスト2
- 2020/09/19 パズルに挑戦 (1)
小町算、覆面算、蛙跳びゲーム、川渡りの問題、油分け算、解答
- 2020/09/19 パズルに挑戦 (2)
大町算、騎士の周遊、嫉妬深い夫の問題、地図の配色問題、スライドパズル NO-OFF、解答
- 2020/09/30 パズルに挑戦 (3)
Four Four's (解答)、騎士の交換 (解答)、ペグ・ソリティア (解答)、8めくり (解答)、スライドパズル (解答)
- 2020/10/25 整数の論理演算とビット操作
基本的な論理演算、基本的なビット操作、組み合わせに番号を付ける、ちょっと便利なビット操作、パズル「ライツアウト」、ライツアウトの解法、高速化、解法プログラム、実行結果、ビット用の高階関数、N Queens Problem
- 2020/10/25 パズルの解法 [4]
ナンプレとは?、盤面の定義、縦横枠のチェック、単純なバックトラックによる解法、実行例 (1)、データ構造を工夫する、フラグの操作関数、バックトラックによる解法、実行例 (2)、プログラムリスト 1, 2
- 2020/10/25 パズルの解法 [5]
ナンプレの確定サーチ、置ける数字が一つしかないマスを探す、縦横枠で置くことができる数字を探す、実行例 (3)、試行順序の変更、プログラムリスト 1
2020/10/31 ちょっと寄り道「ラテン方陣」
- 2020/11/15 パズルの解法 [6]
ナンプレの確定的アルゴリズム、データ構造の変更、バックトラックによる解法、実行例 (4)、Enclosure と Negation、Enclosure の実装、Negation の実装、確定的アルゴリズムによる解法、実行例 (5)、プログラムリスト
- 2020/11/21 パズルの解法 [7]
数独の確定的アルゴリズム、Intersection、Intersection の具体例、Intersection の実装、実行例、追記: 井桁理論 (2020/12/19)、プログラムリスト、おまけ (2020/12/31)
●micro Scheme 編
●言語処理系編
- 2021/06/19 電卓プログラムの作成
プログラミング言語処理系の基本的な構造、文法の表現、式の構文、字句解析、構文解析、式の入力と評価、実行例、単項演算子の追加、実行例 (2)
- 2021/06/19 電卓プログラムの作成 (2)
変数、関数、変数と関数の操作、字句解析、構文解析、実行例、代入を文として実装する場合、実行例 (2)
- 2021/06/19 電卓プログラムの作成 (3)
ユーザー関数の定義、文法の変更、字句解析、構文解析、ユーザー関数の評価、引数の処理、関数定義、実行例
- 2021/06/19 電卓プログラムの作成 (4)
論理演算子と比較演算子の優先順位、条件分岐、文法の修正、字句解析の修正、構文解析の修正、条件分岐の処理、実行例
- 2021/06/19 電卓プログラムの作成 (5)
字句解析と構文解析の分離、ユーザー関数の定義、ユーザー関数の評価、begin 式と while 式、begin 式の処理、while 式の処理、関数 calc の修正、実行例
- 2021/06/19 関数型電卓プログラム fncalc の作成
fncalc の文法、fncalc 用の SECD マシン、式のコンパイル、文のコンパイル、if 文のコンパイル、block 文のコンパイル、while 文のコンパイル、let 文のコンパイル、簡単なテスト
- 2021/06/19 関数型電卓プログラム fncalc の作成 (2)
SECD 仮想マシンの作成、実行例、連結リストの作成、リストの破壊的な修正、ファイルのロード
- 2021/06/26 関数型電卓プログラム fncalc の作成 (3)
継続の導入、callcc のコンパイル、ldct の追加と app の修正、簡単な実行例、大域脱出、繰り返しの中断、再帰呼び出しからの脱出、ジェネレータの作成
- 2021/06/26 関数型電卓プログラム fncalc の作成 (4)
末尾再帰とは?、末尾最適化の仕組み、末尾最適化の実装、仮想マシンの修正、簡単な実行例、相互再帰、たらいまわし関数、遅延評価による高速化
- 2021/06/26 関数型電卓プログラム fncalc の作成 (5)
and と or の修正 (短絡演算子)、and と or のコンパイル、実行例 (1)、ベクタの生成とアクセス方法、ベクタのコンパイル、要素の書き換え、SECD マシンの修正、実行例 (2)
- 2021/06/26 関数型電卓プログラム fncalc の作成 (6)
データの探索、二分探索、バブルソート、選択ソート、単純挿入ソート、クイックソート、エラトステネスの篩、素因数分解、木の操作関数
●オブジェクト指向編
- 2010/03/14 オブジェクト指向の基礎知識
オブジェクトとは?、クラスとインスタンス、メソッド、クラスの定義、キーワード、汎変数、インスタンスの生成、メソッドの定義、スロットのアクセス、<point> クラス、既存のデータ型とクラスの関係
- 2010/03/14 双方向リスト
双方向リストとは?、双方向リストのメソッド、クラスの定義、データの参照、データの更新、データの挿入、データの削除、畳み込みと巡回、データの変換、その他のメソッド、実行例
- 2010/03/21 継承 (1)
継承とは?、単一継承と多重継承、単一継承の使い方、スロットとメソッドの継承、スーパークラスに同じスロット名がある場合、データ型の継承、メソッドの選択、複数の引数がある場合、メソッドのオーバーライド
- 2010/03/21 継承 (2)
制限付き双方向リスト、継承は is-a 関係を表す、スタックの実装、キューの実装、ディーキューの実装
- 2010/03/28 多重継承
多重継承の使い方、多重継承におけるメソッドの選択、スーパークラスに同じスロットがある場合、多重継承の問題点、Mix-in、クラス <enumerable>、イテレータを使う方法
- 2010/03/28 コレクションとシーケンス
既存のデータ型とクラスの関係、コレクションのメソッド、シーケンスのメソッド、コレクションクラスの実装、メタクラスとは?、クラスの定義、メソッドの定義、コレクションの実行例、シーケンスクラスの実装、シーケンスの実行例
- 2010/04/04 モジュール
モジュールとは?、モジュールの定義と評価、import と export、モジュールの作り方、モジュールのロード
- 2010/04/04 共有スロット
共有スロットの設定、共有スロットの継承、共有スロットの衝突、局所スロットと共有スロットの衝突
- 2010/04/17 インスタンスの初期化
総称関数 initialize、ベクタによるキューの実装、プログラムの作成、実行例
- 2010/04/17 可変長ベクタ
可変長ベクタの仕様、クラスの定義とベクタの初期化、汎変数の定義、ベクタのリサイズ、データの使いと取り出し、イテレータ、実行例
- 2010/04/29 ヒープ
ヒープとは?、ヒープの仕様、クラスの定義、メソッドの定義、実行例、ハフマン符号、ハフマン符号のアルゴリズム、節の定義、出現頻度表の作成、ハフマン木の生成、符号化と復号
- 2010/05/01 二分木
二分木の仕様、クラスの定義、データの探索、データの挿入、データの削除、巡回、イテレータと畳み込み、実行例
はじめに
Scheme は 1975 年に Gerald J.Sussman 氏と Guy L. Steele Jr. 氏によって作成された Lisp の方言の一つです。伝統的な Lisp は「動的スコープ (ダイナミックスコープ, dynamic scope)」ですが、Scheme は「静的スコープ (レキシカルスコープ, lexical scope)」を採用しています。その後、Common Lisp でもレキシカルスコープが採用されました。
Scheme の言語仕様は「Revisedn Report on the Algorithmic Language Scheme (RnRS)」と呼ばれていて、IEEE によって公式に定められています。n には数字が入ります。M.Hiroi の知識は R5RS (改訂 5 版, 1998 年) で止まっています。当時の Scheme は、言語仕様がコンパクトにまとまっていて、R5RS でも 50 ページ程度の分量しかありません。
ところが、その後に成立した R6RS (2006 年) では、多くの機能を盛り込んだため言語仕様が大きくなってしまいました。Scheme - Wikipedia によると、R6RS の文章量は R5RS の約 3 倍になるそうです。これに不満を持つ人たちも少なからずいて、なかには独自の規格 (ERR5RS) を検討する人たちもいるようです。
このため、Scheme の言語仕様を大規模バージョン (R7RS-large) と、そのサブセットとなる小さな言語仕様 (R7RS-small) の二つに分けることが 2009 年に発表されました。R7RS-large はまだ制定されていませんが、R7RS-small は 2013 年に制定されました。M.Hiroi はシンプルなプログラミング言語が好みなので、R7RS-small で Scheme を勉強 (再入門) してみようと思っております。M.Hiroi のサビついた腕をどこまでブラッシュアップできるかわかりませんが、興味のある方はお付き合いくださいませ。
●Scheme と Common Lisp の違い
Scheme は関数を first class object として扱うことができます。参考文献 [2] では、first class object を「一等値」と訳していますが、ようするに、プログラミング言語で計算対象となるデータ (値) のことです。関数型言語の場合、関数は他のデータと同等に扱うことができます。つまり、関数を変数に代入したり、関数を引数として渡すことができます。また、関数を値として返すこともできます。
ところが、Common Lisp の関数は完全な first class object ではありません。次の例を見てください。
* (setq func (lambda (x y) (+ x y)))
#<FUNCTION (LAMBDA (X Y)) {100326EA3B}>
* (funcall func 1 2)
3
上の例は SBCL で実行した場合です。ラムダ (lambda) 式は無名の関数を返します。Lisp / Scheme では、それを変数 func に格納して呼び出すことができます。Common Lisp の場合、変数に格納された関数は (func 1 2) のように呼び出すことはできません。funcall や apply を使って呼び出します。これに対し、Scheme は (func 1 2) と呼び出すことができます。次の例を見てください。
gosh> (define func (lambda (x y) (+ x y)))
func
gosh> (func 1 2)
3
このように、Common Lisp よりも簡単に関数を取り扱うことができます。
それから、Scheme は「末尾再帰最適化」を行うことが言語仕様に明記されています。末尾再帰最適化が行われると、次に示すような関数呼び出しにおいて、スタックを消費せずに実行することができます。
gosh> (define foo (lambda () (foo)))
foo
gosh> (foo)
=> 無限ループになる
末尾再帰最適化が行われる場合、foo を評価すると無限ループになります。Common Lisp の場合、末尾再帰最適化は仕様に含まれてないので、最適化の実装は処理系に依存します。M.Hiroi が使っている SBCL は末尾再帰最適化をサポートしています。
また、「継続 (continuation)」を取り扱うことができるのも Scheme の大きな特徴の一つです。継続はプログラムの実行状態を保存しておいて、あとから実行を再開することができます。これは Common Lisp にはない強力な機能です。
●Gauche のダウンロード
Scheme には多数の処理系がありますが、このページでは Shiro Kawai さんが開発されている Gauche をメインに使いたいと思います。Gauche は次のページからダウンロードすることができます。
Windows の場合、バイナリインストーラーが用意されているので簡単です。Unix 系 OS の場合も、インストールスクリプトが用意されているので、それをダウンロードして実行するだけです。また、ソースからビルドすることも簡単にできます。詳細は上記ページをお読みくださいませ。
なお、Unix 系 OS で Gauche をそのまま使う場合、Gauche の REPL (対話モード) にはコマンドラインの編集やコマンド履歴をたどる機能がありません。この場合、rlwrap をインストールすると便利になります。
sudo apt install rlwrap
あとはシェルで rlwrap gosh を実行するだけです。簡単なプログラムであれば、これだけでもかなり便利になります。
●簡単なベンチマーク
Gauche はプログラムをバイトコードにコンパイルする処理系です。その実行速度ですが、拙作のページ Algorithms with Python 再帰定義 の「たらいまわし関数」を使って調べてみました。
リスト : たらいまわし関数 (tak.scm)
(define (tak x y z)
(if (<= x y)
z
(tak (tak (- x 1) y z)
(tak (- y 1) z x)
(tak (- z 1) x y))))
それでは実行結果を示します。(tak 22 11 0) を計算しました。実行時間は (time (tak 22 11 0)) で計測できます。
gosh$ (load "./tak.scm")
"./tak.scm"
gosh$ (time (tak 22 11 0))
;(time (tak 22 11 0))
; real 21.284
; user 21.290
; sys 0.000
11
表 : (tak 22 11 0) の結果
処理系 | 秒 |
Python (ver 3.10.12) | 62.23 |
Ruby (ver 3.0.2p107) | 25.59 |
Lua (ver 5.4.4) | 22.41 |
Gauche (ver 0.9.15) | 21.29 |
ocamlc (ver 4.13.1) | 9.46 |
SBCL (ver 2.1.11) | 4.90 |
Julia (ver 1.10.5) | 1.84 |
SBCL (最適化) | 1.50 |
GCC -O2 (ver 11.4.0) | 1.19 |
ocamlopt (ver 4.13.1) | 1.05 |
- 実行環境 : Ubunts 22.04 (WSL2), Intel Core i5-6200U 2.30GHz
- 改訂 2024 年 10 月 25 日
ネイティブコードや JIT コンパイルする処理系にはかないませんが、バイトコードにコンパイルする Python, Ruby, Lua よりも高速になりました。他にもいろいろな Scheme 処理系があるので、興味のある方は試してみてください。
『お気楽 Scheme プログラミング入門』と『Scheme Junk Scripts』の著作権は筆者「広井誠 (Makoto Hiroi)」が保持します。無断使用や無断転載は禁止いたします。お気楽 Scheme プログラミング入門と Scheme Junk Script で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。
ただし、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi)」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。
Copyright (C) 2006-2024 Makoto Hiroi
All rights reserved.