これはDeadfishに少し似た言語のインタプリタで、馬鹿げたほど簡潔で巧妙になろうとはせず、少しLispyになろうとしています(おそらく、少しうるさいほど純粋主義的な意味で)。特に:
- 割り当てはありません。
- ループはテールコールを介して行われます。
- むしろ、プログラムは出力したはずのリストを返します (実際には、出力したはずの値とアキュムレータの最終値の 2 つの値を返します)。
- ただし、副作用があります。入力ストリームから読み取ります。
これは CL をほぼ確認しています。
- CL 実装は末尾呼び出しの最適化をサポートする必要がないため、これは大規模なプログラムでスタックを使い果たすことができます。
#\Tab
あくまでも準標準的なキャラ名だと思います。
これが正しいかどうかはわかりません:
- このプログラムは、ループの開始時にアキュムレータを修正しますが、これが正しいかどうかはわかりません。
- Deadfish プログラムが、言語の一部ではない入力に対して何をするつもりなのか、私にはよくわかりません。これは吐き出します。
ここ:
(defun deadfish (&key (in *standard-input*)
(initial-value 0))
;; Deadfish from a stream
(labels ((dfl (acc results)
(case acc
((-1 256)
(dfl 0 results))
(otherwise
(let ((c (read-char in nil in)))
(if (eql c in)
(values (reverse results) acc)
(ecase c
((#\h) (values (reverse results) acc))
((#\i) (dfl (1+ acc) results))
((#\d) (dfl (1- acc) results))
((#\s) (dfl (* acc acc) results))
((#\o) (dfl acc (cons acc results)))
((#\Newline #\Space #\Tab)
(dfl acc results)))))))))
(dfl initial-value '())))
(defun deadfish/string (string &key
(initial-value 0))
;; Deadfish from a string
(with-input-from-string (in string)
(deadfish :in in :initial-value initial-value)))
と
> (map 'string #'code-char
(deadfish/string
"iisiiiisiiiiiiiioiiiiiiiiiiiiiiiiiiiiiiiiiiiiioiiiiiiiooiiio
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddo
dddddddddddddddddddddsddoddddddddoiiioddddddoddddddddo"))
"Hello world"
興味深いことに、このプログラムは多くの実装よりも正しいかもしれません:
> (deadfish/string "iiissssssssssoh")
(373391848741020043532959754184866588225409776783734007750636931722079040617265251229993688938803977220468765065431475158108727054592160858581351336982809187314191748594262580938807019951956404285571818041046681288797402925517668012340617298396574731619152386723046235125934896058590588284654793540505936202376547807442730582144527058988756251452817793413352141920744623027518729185432862375737063985485319476416926263819972887006907013899256524297198527698749274196276811060702333710356481)
373391848741020043532959754184866588225409776783734007750636931722079040617265251229993688938803977220468765065431475158108727054592160858581351336982809187314191748594262580938807019951956404285571818041046681288797402925517668012340617298396574731619152386723046235125934896058590588284654793540505936202376547807442730582144527058988756251452817793413352141920744623027518729185432862375737063985485319476416926263819972887006907013899256524297198527698749274196276811060702333710356481