1

私は分岐してLispを学ぼうとしています。基本の1つは、単純なスタックを実装することです。私の機能以外はすべて機能しpopます。

;Returns and removes the first element of the stack
(defun my-pop ()
    (let (temp (car *stack*))
    (setq *stack* (cdr *stack*))
    temp))

これにより、スタックの「最上位」が正しく削除されますが、返されません。以前、私はこれを持っていました:

;Returns and removes the first element of the stack
(defun my-pop ()
    (print (car *stack*)
    (setq *stack* (cdr *stack*)))

しかし、私はむしろトップを返したいです。

私は何が間違っているのですか?(これはスコープと関係があると思います...)

4

1 に答える 1

3

スコープとは関係ありません。構文の問題です。LET の構文は次のとおりです。

(let ((var1 val1)
      (var2 val2)
      ...)
  body)

さらに、 a(varN valN)は just と省略される場合がありvarN、これは と同等(varN nil)です。したがって、あなたが書いたものは次と同等です:

(let ((temp nil)     ; bind TEMP to NIL
      (car *stack*)) ; bind CAR to value of *STACK*
  (setq *stack* (cdr *stack*))
  temp)

LET バインディングには追加の括弧が必要です。

(let ((temp (car *stack*)))
  (setq *stack* (cdr *stack*))
  temp)

組み込み演算子 PROG1 を使用することもできます。

(prog1 
  (car *stack*)
  (setq *stack* (cdr *stack)))
于 2012-09-13T04:38:01.333 に答える