代码之家  ›  专栏  ›  技术社区  ›  Stephen

在emacs中评估Lisp的正确方法是什么

  •  0
  • Stephen  · 技术社区  · 1 年前

    我尝试了《结构与解释》一书中的LISP片段

    (define (a-plus-abs-b a b)
      ((if (> b 0) + -) a b))
    

    在emacs中通过C-x C-e或通过评估整个缓冲区。无论哪种方式 并获取回溯:

    Debugger entered--Lisp error: (void-function define)
      (define (a-plus-abs-b a b) ((if (> b 0) + -) a b))
      (progn (define (a-plus-abs-b a b) ((if (> b 0) + -) a b)))
      eval((progn (define (a-plus-abs-b a b) ((if (> b 0) + -) a b))) t)
      elisp--eval-last-sexp(nil)
      eval-last-sexp(nil)
      funcall-interactively(eval-last-sexp nil)
      call-interactively(eval-last-sexp nil nil)
      command-execute(eval-last-sexp)
    

    如果我尝试{evaluate defun},我会得到一个不同的错误:符号的定义是空的:define

    评估代码段的正确方法是什么?我应该使用emacs之外的东西吗?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Rainer Joswig mmmmmm    1 年前

    执行Emacs Lisp的任何一种方式都可以。

    这里的问题是SICP使用了一种名为Scheme的Lisp。这是一种不同于Emacs Lisp的语言。主要区别在于Scheme是一个Lisp,因此变量和函数不能同名,因此 define 用于创建两者。虽然Emacs Lisp是Lisp 2,你可以有一个同名的函数和变量,所以 defun 定义一个函数 defvar 对于变量-或通常 setq 设置变量值,并在需要时对其进行定义。

    如果你想尝试SICP,你需要一个Scheme解释器或Racket,并使用它的Scheme语言模式。