标签: metacircular

Alan Kay的Eval /应用爱因斯坦时刻

Alan Kay说,仔细阅读代码并找到Lisp 1.5手册第13页代码中唯一的错误,帮助他更好地理解计算机科学100倍.

有问题的代码是eval&的第一个版本,apply它看起来像现代的lisp(我知道).

既然正确的答案可能已知但丢失了(我的google-fu很不错,我至少搜索了20分钟)我将奖励第一个正确的答案(我将查看编辑时间,所以不要试图作弊)尽快获得250点赏金.

我会建议其他人也为赏金做出贡献,记得上面的视频Alan Kay说这些东西让人回想起爱因斯坦在发现相对论时所处的环境.

文本中的代码用M-Expressions编写.我正在翻译从M表达式转换为S表达式(lisp代码)@ https://github.com/Viruliant/MccarthyMCEval-1.5.

无论如何这里是第13页的翻译引用:

;______________________________________Lisp Meta-Circular Evaluator S-Expression
;this code is written in the order it appears on pages 10-13 in the Lisp 1.5 Manual 
;and is translated from the m-expressions into s-expressions

(label mc.equal (lambda (x y)
    (mc.cond
        ((atom x) ((mc.cond ((atom y) (eq x y)) ((quote t) (quote f)))))
        ((equal (car x)(car y)) (equal (cdr x) (cdr y)))
        ((quote …
Run Code Online (Sandbox Code Playgroud)

lisp lambda interpreter eval metacircular

16
推荐指数
2
解决办法
2046
查看次数

你将如何抽象出这对"类似形状"数据类型中的样板

一般问题

我有一对数据类型,它们是表示同一事物的两种不同方式,一种是在String中记录变量名,另一种是在Int中记录变量名.目前,它们都是定义的.但是,我想描述第一个表示,第二个表示将由某种关系生成.

具体例子

具体来说,第一个是STLC术语Universe的用户定义版本,而第二个是同一事物的de Bruijn索引版本:

{-# LANGUAGE RankNTypes, GADTs, DataKinds, TypeOperators, KindSignatures, PolyKinds, TypeFamilies, UndecidableInstances, FunctionalDependencies, FlexibleInstances  #-} 


-- * Universe of Terms * -- 

data Term :: Type -> * where 
    Var :: Id -> Term a
    Lam :: Id -> Type -> Term b -> Term (a :-> b)
    App :: Term (a :-> b) -> Term a -> Term b 

    Let :: Id -> Term a -> Term b -> Term b 
    Tup :: Term a -> …
Run Code Online (Sandbox Code Playgroud)

haskell types lambda-calculus gadt metacircular

6
推荐指数
1
解决办法
230
查看次数

什么是元循环翻译

同一个人可以向我解释什么是元循环翻译?维基百科上的定义是:

元循环求值器是自解释器的一种特殊情况,其中父解释器的现有设施直接应用于被解释的源代码,而无需额外的实现.

但我不知道如何理解句子:"自译器,其中父解释器的现有设施直接应用于被解释的源代码".

在stackoverflow上,我发现答案说元循环解释器是自解释器,没有任何附加功能,所以我很困惑.

提前致谢

interpreter self-interpreter metacircular

5
推荐指数
1
解决办法
769
查看次数

Metacircular评估员,实施环境

我正在尝试根据Harold Abelson和Gerald Jay Sussman着名的"计算机程序的结构和解释"一书中的方案实施Metacircular Evaluator.

http://mitpress.mit.edu/sicp/full-text/sicp/book/node79.html,http://mitpress.mit.edu/sicp/full-text/sicp/book/node80.html

作者建议以这种方式设置环境:

(define (define-variable! var val env)
  (let ((frame (first-frame env)))
    (define (scan vars vals)
      (cond ((null? vars)
             (add-binding-to-frame! var val frame))
            ((eq? var (car vars))
             (set-car! vals val))
            (else (scan (cdr vars) (cdr vals)))))
    (scan (frame-variables frame)
          (frame-values frame))))

(define (setup-environment)
  (let ((initial-env
         (extend-environment (primitive-procedure-names)
                             (primitive-procedure-objects)
                             the-empty-environment)))
    (define-variable! 'true true initial-env)
    (define-variable! 'false false initial-env)
    initial-env))
Run Code Online (Sandbox Code Playgroud)

但是,我无法理解为什么

(define myenv (setup-environment))
Run Code Online (Sandbox Code Playgroud)

应该像我们在Scheme中所期望的那样工作,因为,据我所知,Scheme默认情况下将变量按值传递给函数,因此在将"define-variable!"应用于initial-env两次之后,每次都不会更改initial-env ,并且setup-environment函数将在extend-environment返回时返回值.

我的理解错误在哪里,你能告诉我吗?

先感谢您!

lisp scheme interpreter sicp metacircular

3
推荐指数
1
解决办法
494
查看次数

尝试调用未绑定的fn,而我已定义它

我正在尝试将SICP的元循环评估程序转换为Clojure.在setup-environment调用extend-environment不编译因为我收到错误"尝试调用未绑定的fn".这是代码的一部分:

(... loads of methods for creating and managing environment list)

(def primitive-procedures
  (list (list 'car first)
        (list 'cdr rest)
        (list 'cons conj) ;; TODO: reverse
        (list 'null? nil?)
        (list 'list list)
        (list '+ +)
        (list '- -)
        (list '* *)
        (list '/ /)
        ;;      more primitives
        ))

(def primitive-procedure-names 
  #(map [first
         primitive-procedures]))

(def primitive-procedure-objects 
  (fn [] (map (fn [p] (list 'primitive (second p)))
               primitive-procedures)))

(def the-empty-environment '())

(defn extend-environment [vars vals base-env]
  (if …
Run Code Online (Sandbox Code Playgroud)

scheme clojure sicp evaluator metacircular

2
推荐指数
1
解决办法
3250
查看次数

Racket博士中Scheme的Metacircular评估器

当我尝试在 Dr. Racket 中运行评估器时,它显示错误:“模块语言:定义窗口中只能有一个表达式”。

显然这个窗口中有多个定义,一个评估器有多个定义,那么我如何运行这些多个定义?或者是否有任何其他方法来运行评估器。

任何帮助,将不胜感激。

scheme evaluator racket metacircular

2
推荐指数
1
解决办法
5364
查看次数