新しいアカウントで始めました。

身の回りの出来事や写真が中心です。

「もうひとつのScheme入門」など、から。関数を定義する。

2021-11-16 12:00:00 | Lisp

 加算+はもともと、引数を複数取ることが出来るので、関数を定義するまでもなく、下の画面だけで合計が出ます。関数の名称も変更できます。追加かも知れません。同じような機能のaddを作れるかやってみましたが、引数が2個だけしか出来ませんでした。何故?

  加算の他、乗算も引数は複数取ることが出来ます。

減算、除算も複数の引数を取ることが出来ます。

 有るサイトに、円柱の体積問題が有ったので、やってみました。底面積x高さで、答えは出ます。teimensekiはcircle_areaの別名でいけますね。bottomはcylinder_vol2の内部だけで使えるローカル変数のようです。


コメント (5)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 散歩の写真などから | トップ | EmacsでLispを動かす、書き込... »
最新の画像もっと見る

5 コメント

コメント日が  古い順  |   新しい順
可変長引数 (cametan_42)
2021-11-16 18:03:50
> 同じような機能のaddを作れるかやってみましたが、引数が2個だけしか出来ませんでした。何故?

基本的には次のように書きます。

(define (add . x)
 (apply + x))

あるいは

(define add
 (lambda x
  (apply + x)))

Racket/Schemeでの可変長引数はdefineのsyntax-sugarだと . x と書き、ドット以降に入ってきた引数は全部リストとして纏められます。
apply は関数をリストに適用する高階関数ですね。
同様に、ラムダ式の場合、

lambda x

と仮引数が括弧を伴わないと可変長引数だと解釈されます。
返信する
cametan_42さん、コメントありがとうございます (isam)
2021-11-16 20:24:00
 ディストリビューションによって、微妙な違いが有ることもありそうなので、最低でもSchemeで有ることを確認しておく必要はありますね。
返信する
Racket (cametan_42)
2021-11-16 22:15:52
> ディストリビューションによって、微妙な違いが有ることもありそうなので、最低でもSchemeで有ることを確認しておく必要はありますね。

そうですね。
それで言うとRacketはもうSchemeではないです。
Pascalで言うDelphiの立ち位置ですね。
(ただし、isamさんが今使ってるR5RSはSchemeですが、【言語】->【言語の選択】で「The Racket Languageにした方が本当は良いでしょう)

主なScheme処理系だと

Guile(R5RS): https://www.gnu.org/software/guile/
Chicken Scheme(R5RS): https://www.call-cc.org/
Chez Scheme(R6RS): https://github.com/cisco/ChezScheme
MIT-Scheme: https://www.gnu.org/software/mit-scheme/
Chibi Scheme(R7RS): https://synthcode.com/wiki/chibi-scheme
Gambit Scheme(R5RS): https://github.com/gambit/gambit
Scheme48(R5RS): https://s48.org/
Gauche(R7RS): https://practical-scheme.net/gauche/index-j.html
Sagittarius(R7RS): https://github.com/ktakashi/sagittarius-scheme
なんかがあります。
RnRSのnが大きいほど、最新改訂版に従ってる、って事ですが、事実上、今のトコ、R5RSがいまだにデファクトスタンダードではありますね。
R7RSは、キャッチアップしてる処理系(Gauche)もありますが、どっちかっつーと新規参入組が実装してるケースが多いです。
ここに挙げた処理系は「代表的」なモノですが、元々Schemeの仕様書は歴史的には100ページ以下、と言う「薄い」仕様書な事もあり、個人で実装する人が多く、これら以外にも星の数程実装が存在してる、って言って良いとは思います。
返信する
ディストリビューションまたは分派 (isam)
2021-11-17 08:21:08
cametan_42さん、コメントありがとうございます~。毎回の。
 Linuxのディストリビューションのイメージかと思ったんですが、それ以上の分裂ですね。Linuxでもここまで多くないでしょう。
 DrRacketで言語を「The Racket Language」にした場合、R5RSと同じ感覚で書いて構わないんですか?
返信する
構いません (cametan_42)
2021-11-18 23:03:22
> DrRacketで言語を「The Racket Language」にした場合、R5RSと同じ感覚で書いて構わないんですか?

構いません。
むしろ、昔の旧PLT Scheme時代だとR5RSでも機能追加があったんですが、今のRacketだと完全に素のR5RSで、便利ライブラリ(SRFI)を使うのさえ難儀します。
よっぽどの理由がなければ、RacketでR5RSやR6RSは使わない方が良いでしょう。
返信する

Lisp」カテゴリの最新記事