1

次のような式を返すために、マクロによって呼び出されるある種の関数を取得したと想像してください

(do-something 'argument)

したがって、関数は次のように見える必要があります

(defun form-expression (arg)
  `(do-something ',arg))

しかし、 を呼び出すと(form-expression "foobar")、ラッピング マクロは文字列をパラメーターとして受け取る必要があるため、結果は次のようになります。

(do-something '"foobar")

指定された文字列の引用符を「削除」するにはどうすればよいですか?

4

2 に答える 2

12

あなたの質問は:引用符を取り除く方法は?

この質問はあまり役に立ちません。

1:質問する必要があります、なぜ「引用符」があるのですか?

回答:文字列の構文だからです。

これは文字列です:"buddha"

2:「引用符」なしで何があるかを尋ねる必要がありますか?

回答:記号

これはシンボルです:buddha

3:文字列がある場合、対応する記号をどのように作成または取得できますか?

INTERNまたはを使用する必要がありますFIND-SYMBOL

> (intern "buddha")
|buddha|

4:なぜ垂直バーがあるのですか?

デフォルトでは、すべての記号は内部的に大文字になっています(初期には、大文字のみのコンピューターがたくさんあり、Lispは大洪水のずっと前に発見されていました)。

そのため、Common Lispは、大文字以外の文字が含まれている場合、垂直バーを使用してシンボルをエスケープします。

5:通常の内部大文字記号を取得するにはどうすればよいですか?

関数を使用しますSTRING-UPCASE

> (intern (string-upcase "buddha"))
BUDDHA 

今、私たちは大きな仏を収容しました

于 2012-05-12T09:24:09.777 に答える
2

私があなたを正しく理解しているなら、「foobar」の入力に対して、あなたはの結果を。にform-expressionする必要があります(do-something 'foobar)

その場合は、intern関数を使用してください。intern(のように)ed文字列を渡すか(form-expression (intern "foobar"))、関数でタイプディスパッチを実行する必要があります

(defun form-expression (arg)
   `(do-something ',(if (stringp arg) (intern arg) arg)))

実際には、引数の型をディスパッチしているので、これはメソッドを使用するのに最適な場所です。

(defmethod form-expression (arg) `(do-something ',arg))
(defmethod form-expression ((str string)) `(do-something ',(intern str)))
于 2012-05-12T03:27:28.257 に答える