相変わらず「プログラミングGauche」読んでます。
9.1集合の部分を読んでいて、リストから見つかった要素を1つ削除する手続きを定義したのですがエラーになってしまいました。(写経したのに..)
問題のコードは以下の通り
```lisp
`gutter:true;
#! /usr/bin/env gosh
;; coding: utf8
(define *inventory* (list 'potion 'potion 'dagger 'cokkie 'dagger))
(define (sub-member item list)
(cond ((null? #?=list) #f)
((equal? item (car list)) list)
(else (sub-member item (cdr list)))))
(define (delete-1 elt lis . options)
(let-optional* options ((cmp-fn equal?))
(define (loop lis)
(cond [(null? lis) '()]
[(cmp-fn elt (car lis)) (cdr lis)]
[else (cons (car lis) (loop (cdr lis)))]))
(loop lis)))
(define (main args)
(print (delete-1 'potion *inventory*))
0)
```
実行しようとしたら以下のエラーが... :(
```
:!gosh /private/tmp/test.scm
*** ERROR: syntax-error: the form can appear only in the toplevel: (define (loop lis) (cond ((null? lis) (quote ())) (
(cmp-fn elt (car lis)) (cdr lis)) (else (cons (car lis) (loop (cdr lis))))))
While compiling "/private/tmp/test.scm" at line 11: (define (delete-1 elt lis . options) (let-optional* options ((
cmp-fn equal?)) (define (loop lis) (con ...
While loading "/private/tmp/test.scm" at line 17
Stack Trace:
_______________________________________
シェルが値を返しました 70
```
## 原因
let-optionals*のスペルが間違っていました...
括弧の位置などはあっていたので、condとcons間違えていないかとか調べましたが、原因はlet-optionalsがスペルミスしていました。
```lisp
`gutter:true;
#! /usr/bin/env gosh
;; coding: utf8
(define *inventory* (list 'potion 'potion 'dagger 'cokkie 'dagger))
(define (sub-member item list)
(cond ((null? #?=list) #f)
((equal? item (car list)) list)
(else (sub-member item (cdr list)))))
(define (delete-1 elt lis . options)
(let-optionals* options ((cmp-fn equal?))
(define (loop lis)
(cond [(null? lis) '()]
[(cmp-fn elt (car lis)) (cdr lis)]
[else (cons (car lis) (loop (cdr lis)))]))
(loop lis)))
(define (main args)
(print (delete-1 'potion *inventory*))
0)
```
初めての言語の場合、エラーの時の勘所を抑えるまで単純なエラーでもハマってしまいます。
その辺りは場数を踏むしかないのでしょうか。
0 件のコメント :
コメントを投稿