0

私は難解なプログラミング言語のインタープリターを作成しており、そのためにこのプログラムを作成しました。ただし、目的の出力を提供する代わりに、出力します

*** - EVAL: 未定義の関数 X

このプログラムの問題を明確にするのを手伝ってくれる人はいますか?

私はすでにこのエラーをグーグルで検索し、このサイトで同様の質問をチェックしました。

(setq acc 0)        
(loop              
    (setq x (read-char))                  
    (when (x = #\i)(acc(+ acc 1))) 
    (when (x = #\d)(acc(- acc 1)))        
    (when (x = #\s)(acc(* acc acc)))      
    (when (x = #\o)(write(acc)))  
    (when (x = #\h)(return x))        
    (when (acc <0 or acc =255)(acc =0)))

入力"iiiso"は出力を与える必要があります9。ただし、実際の出力は

*** - EVAL: 未定義の関数 X

4

2 に答える 2

1

これは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
于 2019-07-12T10:03:42.220 に答える