2022-02-01から1ヶ月間の記事一覧
JavaScript の例(7) (TypeScript) TypeScript 版の他のクラスも同様に書き直します。 class Numbers { number: LongDecimal; square_difference: LongDecimal; scale: number; constructor(number: LongDecimal, square_difference: LongDecimal, scale: num…
JavaScript の例(6) (TypeScript) TypeScript 版の LongDecimal クラスを引数にクロージャーを使わないように書き直します。TypeScript ではクロージャーを引数にすることができるのですが、これができないようなプログラミング言語に移植するために書き直し…
C# の例(14) 続いて「仮想サーバー」の NumbersServer クラスについても考えていきます。「仮想サーバー」が状態を持たないとします。このクラスにも時刻 time を導入して、時刻 time ごとに「仮想サーバー」が存在すると考えます。「仮想ブラウザー」では N…
C# の例(13) 続いて「仮想サーバー」の NumbersGenerator クラスについても考えていきます。時刻 time を導入して、時刻 time ごとに「仮想サーバー」が存在すると考えます。そして求める桁と時刻 time が対応していると考えます。ある桁を計算するときは、…
C# の例(12) 続いて LongDecimal クラスについても考えていきます。変数とコンストラクターは以下のようにします。変更不可能なリスト ImmutableList を使います。Select の引数にラムダ式を使っていますが、これは型のチェックを避けるためなので使っても良…
C# の例(11) 変数が変更不可能なプログラミング言語への移植のために変数を変更しないように書き換えていきます。NumbersGenerator クラスと NumbersServer クラスは「仮想サーバー」であるため変更するのは難しいのでそのほかのところから変更していきます…
C# の例(10) Numbers クラスを変更しないようにします。 internal class Numbers { private readonly LongDecimal number; private readonly LongDecimal square_difference; private readonly int scale; public Numbers(LongDecimal number, LongDecimal s…
Go の例(5) Go の例についても同様に修正します。UnfoldL 関数を作成します。 func UnfoldL(f func(*Numbers) (int, *Numbers), init *Numbers) *IteratorSimpleImpl_int { src := init dst := 0 next := func() bool { dst, src = f(src) return true } get…
F# の例(5) 前回の F# 版では UnfoldL 関数を作成しましたが、Seq.unfold 関数を使えば良かったようです。NextDigitAndNumbers は以下のように変更します。値に Some がついています。 let NextDigitAndNumbers (numbers: Numbers): (int * Numbers) option …
Python の例(4) Python 版も同様に修正します。Numbers クラスから CurrentDigit プロパティと current_digit を削除し、コピーするメソッドを追加します。 def Copy(self): return Numbers(self.number, self.square_difference, self.scale) UnfoldL 関数…
F# の例(4) F# 版も同様に修正します。Numbers クラスから CurrentDigit プロパティと current_digit を削除し、コピーするメソッドを追加します。 member this.Copy(): Numbers = new Numbers(number, square_difference, scale) UnfoldL 関数を作成します…
JavaScript の例(5) (TypeScript) TypeScript 版も同様に修正します。Numbers クラスから CurrentDigit プロパティと current_digit を削除し、コピーするメソッドを追加します。 Copy(): Numbers { return new Numbers(this.number, this.square_difference…
C# の例(9) Go の例で Numbers 構造体をコピーするようにしましたが、Numbers 構造体の中に返却するための数が含まれているのは気持ち悪いので、これを構造体に含めないようにします。まず C# の例で考えます。Numbers クラスから CurrentDigit プロパティと…
Go の例(4) (ゴルーチン) クロージャーを使っている部分をゴルーチンで置き換えたものを考えます。イテレーターをゴルーチンで実装した IteratorChannelImpl_int 構造体と IteratorChannelIOImpl_Numbers 構造体を作成します。 type IteratorChannelImpl_int…
Windows 10 のノート PC を購入しました。
C# の例(9) Channel を使ったバージョンは以下のようになります。NumbersGenerator クラスの GenerateDecimal メソッドは以下のようになります。 public IteratorChannelImpl<int> GenerateDecimal() { bool SetToChannel(Channel<int> ch, int n) { async Task<bool> SetToC</bool></int></int>…
C# の例(8) Channel を使ったイテレーターのクラス IteratorChannelImpl を作成しました。「ConfigureAwait(false)」というのは「これがないと await の前後が同じスレッドで実行されるので Result を取得することができない」という仕様らしいです。意味が…
C# の例(7) C# で Channel というものを使うことができるので Go への移植の参考になるかもしれないので調べてみます。C#によるマルチコアのための非同期/並列処理プログラミング を少し参考にしていますが、けっこう古い本なので Channel や IAsyncEnumerab…
Go の例(3) Go のゴルーチンを使わない例も同様に修正します。NumbersServer 構造体の GetNumbers メソッドで計算をしないようにします。コンストラクターで current_numbers に設定する必要はないので削除します。 type NumbersServer struct { current_num…
Python の例(3) Python の例も同様に修正します。NumbersServer クラスの GetNumbers メソッドでは計算の処理をしないようにして、コンストラクターで最初の値を生成するようにします。 class NumbersServer: def __init__(self): number = LongDecimal([]) …
ブラウザーで計算する場合の仕様 「ブラウザーで計算しサーバーから1回ずつ値を取り出す場合」では、イテレーターやクロージャーのような「参照透過性なし」の関数プログラミング的機能、またはオブジェクト指向のオブジェクトを使ってサーバー側のデータを…
F# の例(3) F# 版も C# 版と同様に修正します。NumbersServer クラスの GetNumbers メソッドを値を返すだけに変更し、コンストラクターで generator_server.MoveNext() を1回呼び出します。 type NumbersServer() = let mutable current_numbers: Numbers = …
JavaScript の例(4) (TypeScript) TypeScript 版も C# 版と同様に修正します。Take 関数も間違っていたので修正します。NumbersServer クラスの GetNumbers メソッドを以下のように値を返すだけに変更します。 GetNumbers(): Numbers { return this.current_…
C# の例(6) 「ブラウザーで計算する場合」でサーバー側でも計算していましたが、これは必要ないので修正します。NumbersServer クラスの GetNumbers メソッドを、以下のように値を返すだけに変更します。 private Numbers GetNumbers() { return generator_s…
Go の例(2) (ゴルーチン) 次にゴルーチンを使ったものを考えます。GenerateDecimal をゴルーチンを使って以下のように書き直します。これはクロージャーを使っているのでクロージャーの代わりにゴルーチンを使っているわけではありません。 func (xyz *Numbe…
Go の例(1) Go ではクロージャーで実装しました。イテレーターを表すもの(構造体)などを型ごとに複数作っているので長くなります。Goはこのようなプログラムには向いていないようです。xyz は構造体の自分自身を表す名前なのですが self などは使えないよう…
F# の例(2) F# もコンストラクターを3個に削減しました。Seq.unfold (iterate に相当)を使っています。 let Align0<'T> (xs: 'T list) (len: int) (z: 'T): 'T list = [ for xd in xs do yield xd for i in xs.Length .. len - 1 do yield z ] let ZipWith0<…
JavaScript の例(3) (TypeScript) コンストラクターを1個にしました。イテレーターを保持する変数はやはりクラスの中には書けません。これはどうすれば良いのかわかりません。Visual Studioでこれを実行すると出力が「出力」の領域に出ないので出力がよくわ…
C# の例(5) 次にイテレーターとなるクラスを(IEnumerable インターフェイスとは関係なく)作って実装します。イテレーターに対する入力もできるようにします。 サーバーで無限に計算する場合 NumbersGenerator クラスの GenerateDecimal と コンストラクター …
C# の例(4) このあたりから本題に入ります。イテレーターの yield のような機能がないプログラミング言語用に、クロージャーを使ってイテレーターを実装します。C# ではデリゲートというものを使うのですが、デリゲートという用語の定義はいろいろと細かいこ…