3
(define defun define)

define: not allowed in an expression context in: defineラケットでエラーを起こします。definelet、 のような基本的な構造のエイリアスを作成する方法はlambda?

4

3 に答える 3

4

defineは構文であり、ファーストクラスのオブジェクトではありません。オブジェクトとして参照することはできません。

ジャスティンが言ったように、マクロを作成できます。ただし、Lisp スタイルdefunは Scheme スタイルとは異なる構文を持っていることに注意してdefineください。マクロはそれを考慮に入れる必要があります。

(define-syntax-rule (defun name params body ...)
  (define (name . params)
    body ...))
于 2013-11-14T15:59:02.127 に答える
1

通常の手順では、define でエイリアスできます:

(define first car)  ; first isn't defined in R[67]RS

ただしdefinedefunフォーム互換性はありません。このマクロはdefun、Common Lisp のように機能するグローバルを作成します。

#!r6rs
(import (rnrs base))

(define-syntax defun
  (syntax-rules ()
    ((defun name args . body)
     (define (name . args) . body))))

definedefun主にSchemeの1つの名前空間の性質のため、Schemeではより多くのハットがあります。、、およびdefineとして機能します(ただし、以前にバインドされている場合は、更新に使用する必要があります)。labelsfletdefconstantsetqset!

于 2013-11-14T16:05:45.397 に答える