Simple Scheme で電卓をつくってみる(13.5)

×=等の機能をいれる前は=ボタンは演算ボタンと似たようなもの―というよりは=ボタンはget2ndと結びつけられた演算ボタンでした。 別扱いにしていたのはいずれ異なる機能を持つことがわかっていたからです。 んで、=ボタン用の関数は他の演算ボタンと同じよう…

Simple Scheme で電卓をつくってみる(13) ― メモリ機能 ―

メモリーキーを実装します。 右端にあるM+、M-、MRの3つのボタンですね。 メモリーキーは計算結果を保存し、あとで取り出せるようにするボタンです*1。 というわけでまず保存内容を保持する変数を用意します(というかすでにmemoryという名前で大分前から用…

Simple Scheme で電卓をつくってみる(12) ― 2倍、0、2乗、1 ―

加減乗除が揃い、また、エラー処理ができるようにもなりました。 加減乗除を使った機能を追加しましょう。 電卓で×=と打ち込むと、それまでの計算結果にそれまでの計算結果をかけた値―つまり「それまでの計算結果」の2乗が得られます。 ÷=だとそれまでの計算…

Simple Scheme で電卓をつくってみる(11) ―エラー処理―

Simple Schemeで電卓を作っています。割り算を組み込んで加減乗除が揃いましたが、0で割ろうとした場合の対応をまったく考えていませんでした。 0で割ろうとすると0除算エラーなので、エラー処理機構を作ります。 桁溢れエラーの処理もここでやってしまいま…

Simple Scheme で電卓をつくってみる(10) ―割り算させてみる―

加減乗除のうちまだないのは除算―割り算だけですね。割り算を組み込みましょう。 電卓の内部で数はリストで表現されていますが、リスト÷リストだと大変なのでリスト÷整数型にします。 まず具体的に割り算してみましょう。 (define (i/% x y) (let ((q (/ x y…

Simple Scheme で電卓をつくってみる(9) ―掛け算させてみる―

Simple Schemeで電卓を作っています。 掛け算を組み込みましょう。 多倍長計算します。8桁程度なら64ビット整数どうしでも桁溢れすることなく計算できますが、12桁くらいまでは対応できるようにしたいのと、表示まで考えると整数型は却ってややこしくなる部…

Simple Scheme で電卓をつくってみる(8)

さらに心理的に落ち着くために、これからしようとしている計算が足し算なのか引き算なのか掛け算なのか割り算なのかを表示するようにしましょう。 そのためには、これからしようとしている計算を表す記号を電卓の表示機構に知らせる必要があります。 まず演…

Simple Scheme で電卓をつくってみる(7.5)

単に第2引数を返すだけだと最初の数値入力で小数部分に余分な0を入れた場合、=を押しても0が残ってしまいます。別に残ってもいいのですが取り除くのもそれほど難しくありません。 (define (get2nd x y) (make-num (num-sign y) (num-i y) (rdrop0s (num-f y)…

Simple Scheme で電卓をつくってみる(7)

=を実装しましょう。 =が押されると、それまでの計算結果と最後に入力された数に対して最後の数の入力直前に押された演算ボタンの演算が適用されます*1。 演算ボタンとほとんど同じ機能ですが、=に割り当てられた演算は特にありません。というわけで基本は他…

Simple Scheme で電卓をつくってみる(6)

Simple Schemeで電卓を作っています。 足し算と引き算を実行するコードができたので電卓に組み込みましょう。 演算ボタンが押されると何らかの関数が呼び出されるわけですが、その関数は下記のmake-opで生成することにします。 (define op add) (define (mak…

Simple Scheme で電卓をつくってみる(5.7)

前回は電卓内で実行される計算の内、加減算の具体的なやり方を決めました。 電卓内で実際に保持される数はリスト型ではなくnum型です。なので、前回のコードを利用してnumの加減算を定義しましょう。 numは整数部分と小数部分をリストで保持するstructureで…

Simple Scheme で電卓をつくってみる(5.3)

多倍長計算で加減算を行う関数を定義しましょう。 桁ごとに足してから繰り上がり、という順序で処理します。 桁ごとに足すためにmap2を定義します*1。 (define (map2 f l1 l2) (build-list (length l1) (lambda (i) (f (list-ref l1 i) (list-ref l2 i))))) …

Simple Scheme で電卓をつくってみる(5)

数を入力できるようになりました。 入力した数は、整数部分と小数部分をそれぞれトップレベル変数で保持するようになっています。画面に表示するときはこれらの変数から直接数値を取り出してイメージに変換して表示しています。 しかし、この方法では入力し…

Simple Scheme で電卓をつくってみる(4)

Simple Schemeで電卓を作っています。データ保持の方法が一応決まったので実装しましょう。 整数部分と小数部分を表すリストを暫定的にトップレベル変数にバインドしておきます。 電卓で数値を入力すると、このリストに数値が追加されていくようにしたいわけ…

Simple Scheme で電卓をつくってみる(3.5)

見た目ばかりいじってないでそろそろ電卓の計算機構を作りましょうね。 入力した数値や計算結果の保持方法を考えましょう。 桁数固定で小数点が移動するので10進の浮動小数点数がよいような気がしますが少しだけ違うのですね。 例えば1.111111と0.1111111と…

Simple Scheme で電卓をつくってみる(3)

Simple Schemeで電卓を作っています。前回までで、ボタンを押したら反応するようになりました。 今度はボタンごとに異なる反応を返すようにしてみましょう。 押したボタンの上に、ボタンの文字と同じ色の円盤を重ね、その上に白抜きでボタンの文字を拡大表示…

Simple Scheme で電卓をつくってみる(2)

Simple Schemeで電卓を作っています。前回はキーボードの画像を表示するところまで作りました。 続いて、ボタンをタップしたらとりあえずなにか反応を返すようにしてみましょう。 タップされたボタンの位置に黒い円盤を表示させます。 前回は画像の表示にsho…

Simple Scheme で電卓をつくってみる

Simple Schemeで電卓を作ります。関数電卓とかスマホに最初から入ってるようなのとかじゃなくて、普通のやつ(「普通電卓」というのですね。それを作ります )。 最初にキーボードのイメージを作りましょう。 まずはボタンのリストです*1。 (define button-l…

Scheme のメタ循環インタプリタに関する備忘録(3) — 多値と apply —

「Scheme のメタ循環インタプリタに関する備忘録(2) — call/cc —」の続きです。 継続に多値を渡せるようにしましょう。 このインタプリタは渡されたコードを継続渡し形式の手続きに変換しながら処理します。 継続渡し形式の手続きや継続は、末尾呼び出しで呼…

Scheme のメタ循環インタプリタに関する備忘録(2) — call/cc —

「Scheme のメタ循環インタプリタに関する備忘録(1)」の続きです。 https://gist.github.com/brv00/bee4093b023448fcd8505583c40f3cf2/0c7509bb4bc14f245eb2deb39568402b5cc9005d の call/cc が失敗する例を挙げておきましょう。0を無限に印字する(はずの)…

Scheme のメタ循環インタプリタに関する備忘録(1)

JScheme には継続を取得する仕組みがありません。そこで継続が取得できるメタ循環インタプリタを(JScheme で)書くことにしました。 0 から作るのは大変な気がするので『The Scheme Programming Language』の Extended Examples の Section 7. A Meta-Circu…

循環が始まる場所

SRFI には、circular-list? というプロシージャがありオブジェクトが循環リストかどうかを知ることができますがどこから循環が始まっているかまで知ることはできません。 ところが、circular-list? の SRFI-1 の参照実装を少し書き換えるだけこれを知ること…

数を表すフランス語の文字列を数値に変換する(0-9223372036854775807)

「数を表すフランス語の文字列を数値に変換する(0-999999)」の続きです。 前回は、0–999999の範囲の数を表す言葉(を構成する単語のリストから "et" を取り除いたもの)を(もとの)言葉が表す数に変換する convert-inv<10^6 というプロシージャを定義しまし…

数を表すフランス語の文字列を数値に変換する(0-999999)

数を表すフランス語の文字列を数値に変換する(0-99)の続きです*1。 前回は、100未満の数を表す言葉を構成する単語のリストから "et" を取り除いた*2もの*3を、もとの言葉が表す数に変換する convert-inv<100 というプロシージャを定義しました。 convert-inv…

数を表すフランス語の文字列を数値に変換する(0-99)

(convert-inv は invert という名前でしたが invert に「逆変換する」という意味はないっぽいので名前を変えましたよ*1。 2018.9.2) 数をフランス語の文字列表現に変換する (0-9223372036854775807)の続きのようなものです。もう限界まで変換したので*2今…

数をフランス語の文字列表現に変換する (0-9223372036854775807)

「数をフランス語の文字列表現に変換する (0-999999)」の続きです。 0から999999までの数をフランス語の文字列表現に変換する Scheme コードを再掲します。 (define fst17s #("zéro" "un" "deux" "trois" "quatre" "cinq" "six" "sept" "huit" "neuf" "dix" …

数をフランス語の文字列表現に変換する (0-999999)

「数をフランス語の文字列表現に変換する (0-99)」の続きです。 前回書いたコードを再掲します。100未満の数は convert<100 でフランス語に変換できます。 (define fst17s #("zéro" "un" "deux" "trois" "quatre" "cinq" "six" "sept" "huit" "neuf" "dix" "…

数をフランス語の文字列表現に変換する (0-99)

(cinq の綴りが間違っていたので修正しました。2018.8.25) 数をフランス語で表したくなったので変換プログラムを書きます。言語は Scheme です。旧正書法に従った表記に変換されます。(正書法については次のサイトを参考にしました。 http://chiffre-en-let…