Lisp 神秘球拍错误:定义:未绑定标识符;此外,没有#%app syntax transformer绑定在:define中

Lisp 神秘球拍错误:定义:未绑定标识符;此外,没有#%app syntax transformer绑定在:define中,lisp,racket,Lisp,Racket,此程序产生一个错误: define: unbound identifier; also, no #%app syntax transformer is bound in: define 当粘贴到REPL(确切地说,最后一行:(displayln(eval子句state))时,它可以工作。在定义窗口中运行时,它失败。我不知道为什么 #lang racket (define *state* '((a false) (b true) (c true) (d false))) (define *cl

此程序产生一个错误:

define: unbound identifier;
 also, no #%app syntax transformer is bound in: define
当粘贴到REPL(确切地说,最后一行:(displayln(eval子句state))时,它可以工作。在定义窗口中运行时,它失败。我不知道为什么

#lang racket
(define *state* '((a false) (b true) (c true) (d false)))
(define *clause* '(a (not b) c))

(define (eval-clause clause state)
  (for ([x state])
    (eval `(define ,(first x) ,(second x))))
  (eval (cons 'or (map eval clause))))

(displayln (eval-clause *clause* *state*))
这也是:

(define (eval-clause clause state)
  (eval `(let ,state ,(cons 'or clause))))
产生

let: unbound identifier;
 also, no #%app syntax transformer is bound in: let
这是我尝试翻译下面的公共Lisp程序:公共Lisp在这里获胜

; (C) 2013 KIM Taegyoon
; 3-SAT problem
; https://groups.google.com/forum/#!topic/lisp-korea/sVajS0LEfoA
(defvar *state* '((a nil) (b t) (c t) (d nil)))
(defvar *clause* '(a (not b) c))

(defun eval-clause (clause state)
  (dolist (x state)
    (set (car x) (nth 1 x)))
  (some #'identity (mapcar #'eval clause)))

(print (eval-clause *clause* *state*))
以及:


eval
在球拍中很棘手。根据Racket Guide,15.1.2,您需要钩住当前名称空间,如下所示

(define-namespace-anchor anc)
(define ns (namespace-anchor->namespace anc))
然后将
ns
添加到对
eval
的每个调用中:

(define (eval-clause clause state)
  (for ([x state])
    (eval `(define ,(first x) ,(second x)) ns))
  (eval (cons 'or (map (curryr eval ns) clause)) ns))
请注意,这在REPL中不是必需的,如上面引用的文档所述

但是,最好为您的定义创建一个特定的名称空间,这样它们就不会与您自己模块的定义混淆:

(define my-eval
  (let ((ns (make-base-namespace)))
    (lambda (expr) (eval expr ns))))

(define *state* '((a #f) (b #t) (c #t) (d #f)))
(define *clause* '(a (not b) c))

(define (eval-clause clause state)
  (for ([x state])
    (my-eval `(define ,(first x) ,(second x))))
  (my-eval (cons 'or (map my-eval clause))))

(displayln (eval-clause *clause* *state*))
或者,如果您想继续使用
racket/bool
中的
true
false
,请定义
my eval
,如下所示

(define my-eval
  (let ((ns (make-base-namespace)))
    (parameterize ((current-namespace ns))
      (namespace-require 'racket/bool))
    (lambda (expr) (eval expr ns))))

我将编写更简单的通用Lisp版本:

(defun eval-clause (clause state)
  (loop for (var value) in state
        do (set var value))
  (some #'eval clause))

循环形式更具描述性(因为我们可以摆脱
CAR
NTH
),并且
EVAL
可以直接用于
某些功能。

感谢您的解释!如果时间允许,还可以查看我的Paren编程语言(Lisp方言):因为这个,至少浪费一个小时。。。谢谢哇!多聪明的回答!
(defun eval-clause (clause state)
  (loop for (var value) in state
        do (set var value))
  (some #'eval clause))