-1

LISP でプログラムを作成して、ユーザーから文字列を取得し、文字列の各文字コードに 1 を追加して形成された文字列を返したいと考えています。例えば:

入力: 「hello123」 出力: 「ifmmp234」

文字を1つずつASCIIに変換してから、やりたいことをやるべきだと思いました。

これに関する任意のヘルプは非常に高く評価されます..

ありがとう

これは私が開発したコードです。ただし、出力に NIL が表示されます。これで私を助けてもらえますか:

(defun esi (n)
  (setf m 0)
  (loop (when (< m (length n))
          (return))
        (code-char (+ 1 (char-code (char n m))))
        (+ 1 m))) 
4

2 に答える 2

4

関数char-codeとを見てくださいcode-char

編集:あなたのコードサンプルに関して:

  • 関数への入力は文字列である必要があるようです。そのような名前を付けstringます。
  • それ(setf m 0)は自由変数を設定することです。このコンテキストではm、これはどこにも定義されていないため、動作は定義されていないと想定する必要があります。たとえば、let代わりにローカルバインディングを確立するために使用する必要があります。ヒント:ほとんどのループ構造は、ローカルバインディングを確立する方法も提供します。
  • ループの唯一の出口はそれ(return)です。パラメータを取得しないため、常に。を返しnilます。新しい文字列をどこかに蓄積して、最後に返す必要があります。
  • Lispの関数はほとんど引数を変更しません。 (+ 1 m)変更しませんm。。より1つ大きい値を返すだけですm。同様に、code-char引数を変更しませんが、引数に対応する文字である新しい値を返します。これらの値をバインドまたは割り当てる必要があります。
  • その仕上がり条件が間違っています。直接終了するか、入力文字列が空の場合は終了しません。
于 2012-07-14T13:36:54.500 に答える
1

あなたがやりたいことをする方法はかなりたくさんあります。1コードポイント後に文字を返す関数から始めましょう(ここにはいくつかの境界の問題がありますが、今はそれを無視しましょう)。

(defun next-codepoint (char) (code-char (1+ (char-code char))))

現在、これはキャラクターに作用します。幸いなことに、文字列は基本的に文字のシーケンスです。シーケンス操作は、一般に、MAPファミリーの方向にあなたを送るはずです。

だから、私たちは持っています:

(defun nextify-string (string) (map 'string #'next-codepoint string))

何が起こっているかを段階的に説明します。

  • 入力stringmの各文字に対して、次のようにします。
    • 文字をコード属性に変換します。
    • これをインクリメントします
    • キャラクターに変換し直します
  • 次に、これらすべてを戻り値にアセンブルします。
于 2012-07-15T14:20:16.293 に答える