2016-10-07 15 views
-1

2つの文字列パラメータを取得する関数を作成しました。この関数は各文字列の長さを単純に加算します。以下はコードです。 Common-LISPプログラミングで2つの文字列パラメータを持つ呼び出し関数

(defun add_twostring_length (mystr1 mystr2) 
(+ (length mystr1) (length mystr2)) 
) 

私はこのようなadd_twostring_length関数を呼び出す

(add_twostring_length "cpp" "lisp")

出力は正しいです。私は、エラーメッセージが表示されました

(add_twostring_length "cpp", "lisp")

、コンマを使用しての方法で、同じ機能を呼び出す

しかし、。

Error: Comma not inside a backquote.

[condition type: READER-ERROR]

私は(add_twostring_length "cpp", "lisp")のように関数を呼び出したいと思います。

コードに何が間違っていますか?

picture showing error message

+2

カンマは、逆引用符でエスケープするためのものです。あなたにはバッククォートがないので、エスケープすることはありません。 –

+0

私はいくつかのヒントを教えていただけますか? ' ) (これは動作しません)。 第二に、私は '((mystr1)(mystr2))((長さmystr1)(長さmystr2)) )defuch add_twostring_length 'を試しました。' これも動作しません。 私にいくつかのヒントを教えてもらえますか? @ChrisDodd –

+3

@朴州賢Lispで引数を区切るためにカンマを使用することは想定されていません。引数は、最初に行ったのと同じように、常にスペースで区切られます。カンマを使用すると構文エラーが発生し、動作しません。 – jkiiski

答えて

0

は可能ですが、私は強く、それを使用してに対するをアドバイスします:

(set-macro-character #\, 
        #'(lambda (stream char) 
         (read stream t nil t))) 

上記のコードは、いわゆる「マクロ読み」を作成します。読み込み時には、共通のlispは全ての出現を,で見つけ、無視する。これはそうのような可能性を呼び出す関数を作る:

(+ 1, 2, 3) ; => 6 

しかし、これはテンプレートでエスケープ解除されます:

`(1 2 ,(+ 3 4)) ; => (1 2 (+ 3 4)) 

は、おそらくリードマクロは、よりインテリジェントにすることが可能であるが、私は探求したくありません私はそのアイデアが気に入らないので、これをより深く理解してください。ごめんなさい。

+0

私はあなたの考えを理解していません。 add_twostring_lengthコールでchar(あなたの提案したコード内)を置き換えるべきですか? –

+0

@朴州鉉(1)** Lisp Reader **:http://www.lispworks.com/documentation/HyperSpec/Body/23_a.htmを変更することです。この式は現在の** readtable **を変更して、コンマは空白と似ています。 (2)いいえ、あなたは最初のスニペットを実行することになっています(3)あなたはまだ**なぜ**あなたはその機能がほしいと言っていませんでした。あなたの要求が不合理であるため、これは重要です。 – coredump

+0

本当にそれらの余分な '、'を書くのは時間の無駄です。そこにいる必要はなく、最終的にはあなたの眠りにつかまえるバグを与えます。マクロの中で誤って '\'(/ ab、(+ 5、d) 'を実行した場合、内部リストが間違って引用されていないというバグと、数値リテラルでテストするとバグを見つけられないとします。がんばろう! – Sylwester

8

あなたにも「なぜ私は括弧なしで関数を呼び出すことはできません?」頼むかもしれませんリスプでは、車の中の関数とcdrの引数を使って関数をsexprとして呼び出します。コンマはありません。それはlispの構文です。何をしたい

関連する問題