見出し画像

Retro-gaming and so on

RE: プログラミング日記 2022/02/11〜

星田さんの記事に対するコメント。

「ash」の方がオシャレですね(?)。

Racketにはarithmetic-shiftと言う関数が用意されています。
あるいは、ビット演算に関するSRFI-60を使用しても良いでしょう(こっちではashと言う名前も提供されている)。

むっ!「sub1」?ほえ~引数から1を引くとか・・えらい特化されてんなぁ。

ちょっと古い記述法な気もしますがね。
余談ですが、大昔のLispだと+とか-と言う記号の代わりに

(ADD 1 2)

とか

(SUB 2 1)

とか記述してたりしました。
いずれにせよ、下の方のコードにも使われてますが、ANSI Common Lispでは1+とか1-とか言う関数も提供されてるんで、それ代わりです。
なお、ANSI Common Lispではincfdecfと言うマクロも提供されていて、こちらは破壊的変更を伴います。

CL-USER> (defparameter n 0) ;; nを定義
N
CL-USER> (1+ n)      ;; n に1+を適用してみる
1
CL-USER> n        ;; n 自体は変わってない(関数的)
0
CL-USER> (incf n)      ;; n にincfを適用してみる
1
CL-USER> n        ;; n は破壊的に変更される
1
CL-USER> (1- n)      ;; n に1-を適用してみる
0
CL-USER> n        ;; n 自体は変わってない(関数的)
1
CL-USER> (decf n)     ;; n にdecfを適用してみる
0
CL-USER> n        ;; n は破壊的に変更される
0
CL-USER>

あと、「set!」の読みが「セットバン」って・・知らなんだ

PAIP(実用Common Lisp)、711ページより。

Schemeの大半のミューテータは、set!のように末尾が「!」である。Common Lispにはこのような一貫した規約はない。nreverse、nsubst、nintersectionのように、nではじまるミューテータはいくつかあるが、一方で、deleteとremoveのように固有の名前を持つものもある。Schemeの処理系で、これらの関数が定義されている場合は、reverse!やremove!のように、一貫した名前になるだろう(標準的には定義されていない)。Schemeの述語は末尾が「?」である。これにより、述語であることが明確になるとともに、pの前にハイフンを追加するための複雑な規約を排除できる。この規約の唯一の問題点は、話し言葉の発音である。すなわち、equal?は「equal-question-mark」または「equal-q」と発音するか、おそらく、上昇調のイントネーションで「equal」と発音するかもしれない。そうなると、Schemeは中国語のように音調言語になるだろう。

100%、ピーター・ノーヴィック先生は「ギャグ」を入れたつもりなんだろうけど、翻訳調だと活かされてないな・・・・・・(苦笑)。
いずれにせよ、記述としての命名法はさておき、読むのが厄介だ、ってのは事実です。
"!"をbangと表現するのは、Schemeと言うよりはUNIX系の文化でしょうね。set!をset-bangって呼べよ、ってのが正式かどうかは分からないですが、UNIX由来の言い回しだと思います。
何度か出てきましたが、Pythonなんかのプログラムの冒頭で使ってるシェバング、あるいはシェバン

#! /usr/bin/env python

の"#!"ってのは元々Sharp-bang(シャープ・バング)を縮めた言い方で、こういう!の呼称法はUNIXで広まってるモノです。
Schemeは歴史的にUNIXと仲良くやってる期間が多いので、その辺で読み方が影響を受けている可能性が高いです。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「RE: プログラミング日記」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事