2017-09-14 4 views
0

インフィックス入力を接頭辞に変更する関数を作ってみようとしています。例えば、を入力として(+ x 1)として出力します。だからここLisp、defunで動作しない命令

は一瞬のために私のコードです:I入力リストとユーザーの入力ならば、それはリストでなければ

(setq x '(Y + 1)) 
(if (listp x) (list (second x) (first x) (first (last x))) x) 

ので、(+ Y 1)を返します。

しかし、問題は、私はこのコードは関数の中で働いて得ることができないということです。

(defun prefixToInfix (x)(
    (if (listp x) (list (second x) (first x) (first (last x))) x) 
    ) 
) 

関数が実際に作成されますが、私は

(prefixtoinfix '(Y + 1)) 

それを呼び出すとき、私はエラーを取得しています私のif文は、メインプログラムで動作しますなぜ私は私からそれを実行していないとき、私は知らない

Error: Illegal function object: (IF (LISTP X) (LIST # # #) X). 
[condition type: TYPE-ERROR] 

関数。

+2

関数本体の周りに余分なカッコがあります。 – jkiiski

+0

どういう意味ですか?それを修正できますか? –

+1

最初の行 '(x)(' - > '(x)')と最後の閉じた括弧の末尾にある括弧を削除してください – jkiiski

答えて

4

あなたが欠けているのは、Lispのカッコでは、が意味のあるです。

はC/Javaの/ Pythonの& Cでは、以下の式が同じである。Lispでは

a+b 
(a+b) 
(a)+(b) 
(((a)+(b))) 
(((((a)+(b))))) 

、以下の式は非常に異なっている:

  • a ---シンボル
  • (a) ---シンボルである単一要素のリストa
  • (1 (2)) ---二つの要素のリスト:あなたの場合、機能(ノートインデントや括弧の配置で数2

を含む長さ1のの

  1. 1
  2. リスト、! )

    (defun prefixToInfix (x) 
        ((if (listp x) (list (second x) (first x) (first (last x))) x))) 
    

    ifの周りに余分な括弧を持っている(これはWholおよびの原因電子if悲惨な結果で、関数として解釈される形式)、および(ノート改行やインデントする必要があります - lispersは括弧をカウントしていない、彼らはhttp://lisp-lang.org/style-guide/を参照して、コードを理解するためにインデントを見て)

    (defun prefix-to-infix (x) 
        (if (listp x) 
         (list (second x) 
          (first x) 
          (first (last x))) 
         x)) 
    

    PS。 want to learn common lispの推奨事項も参照してください。

関連する問題