2010-12-04 22 views
3

私はスキームでスタックをエミュレートしようとしています。私はDrSchemeを使用しており、言語R5RSを選択します。私は、ポップ、プッシュ、およびピークの機能を作成する必要があります。しかし、私はどのように参照渡す方法を考え出すのに問題があります。私はボックスに関するいくつかの情報を読みましたが、R5RSではサポートされていません。参照渡すための他の方法はありますか?スキームR5RS:参照渡し

答えて

0

命令型言語で行うことができる「参照」を渡す代わりに、Schemeは機能的な意味で考えることをお勧めします。

  • スタック
  • 新しい要素

リターンと組み合わせて、新たな要素が含まれている新しいスタック:これはあなたのpush操作は、例えば、2つのパラメータを取ることを意味します既存のスタックの残りの部分。同様に、popオペレーションはスタックをとり、先頭の要素がなくなったものを返します。peekは先頭の要素の値を返します。

Schemeのリストはスタックとほぼ同じように動作します。以下のマッピングは、あなたが始めるのに役立つでしょう: - 短所

  • ポップ -
  • のぞく残り -

    • プッシュ最初の
  • +0

    トップの要素を削除してリストを返す以上のことをするには、popが必要です。 pop関数は、リストからも削除しながら、一番上の要素を返す必要があります。したがって、リストを返すことはできません。なぜなら、トップエレメントを返さなければならないからです。 – Crbreingan

    +0

    'pop 'の前に' peek'を使って削除する前にトップの要素を取得することができます。または、 'pop'がペアを返すようにすることができます。この場合、先頭の要素がポップされた後に、carが先頭要素で、cdrが新しいスタックになります。 –

    1

    短い答え:R5RSを使用しないでください。ちょうど母国語を使用してください。 DrRacketの現在のバージョンでは、その言語は「ラケット」と呼ばれています。ここでボックスを使用するプログラムです:

    #lang racket 
    
    (define b (box 234)) 
    
    (set-box! b 333) 
    
    (unbox b) 
    

    FWIW:グレッグの答えは私のものよりも、純粋に機能的であるが、変更可能な構造はDrRacket(旧姓DrScheme)で使用できないことを信じること間違いだろう。

    最後に、「参照による呼び出し」という用語を誤って使用しています。ボックスは単なる変更可能な構造体であり、value-by-value言語(ラケット、r5rs、javaなど)はこれらの構造をうまく突然変異させることができます。