3

Racket にはset-car!関数がなく、次のように実装したいと考えています。

(define myset-car!
  (lambda (list value)
    (if (not (list? list))
        #f
        (set! list (cons value (cdr list))))))

しかし、それは機能しません。次のように使用すると、リストの値を変更できません。

 (define p (list 2 3 4))
 (myset-car! p 'a)
 p  ; p still is (2 3 4)

誰でも理由を教えてもらえますか? 私がしていることの何が問題なのですか?

4

3 に答える 3

2

まだ誰もマクロを提案していないので、あなたの場合に役立つ解決策は次のとおりです。

(define-syntax-rule (myset-car! lst val)
  (if (not (list? lst))
      lst
      (set! lst (cons val (cdr lst)))))

(define p (list 2 3 4))
(myset-car! p 'a)
p 

収量

'(a 3 4)

マクロとも呼ばれる構文形式は、プロシージャを呼び出さずにソース コードを直接変換するためです。

Dr Racket でのマクロ展開 (つまり、ソース コードが変換されます)

(define-syntax-rule (myset-car! lst val)
  (if (not (list? lst)) lst (set! lst (cons val (cdr lst)))))

(define p (list 2 3 4))
(if (not (list? p)) p (set! p (cons 'a (cdr p))))
p
于 2013-08-29T21:06:16.330 に答える