【问题标题】:The code of the build-in Scheme procedure "pair?"内置 Scheme 程序“pair?”的代码
【发布时间】:2016-10-27 15:27:40
【问题描述】:

我开始研究Scheme,很好奇内置程序是如何“配对”的?作品。我的意思显然是代码,因为我找不到查看内置程序代码的方法并且不知道如何编写它我在这里。 对“列表”有同样的问题吗?程序但设法自己编写,但在“配对”的情况下?不知道。谢谢!

【问题讨论】:

  • 听起来你想看看你正在使用的方案实现的源代码。那么...您使用的是什么方案实现? :)
  • 是的,先生! DrRacket)
  • pair? in Racket (我不知道方案)是一个原语。每个Scheme_Object * 都有一个标签,说明它是什么类型。 pair? 查看该标签,如果它与对类型的值匹配,则返回 #t
  • 所以这意味着这是一个原始的,我们不能用其他方式定义它?
  • @Dmitrii 第一个 Scheme 实现是在 Lisp 1.5 后裔下的解释器,类似于 Common Lisp,但没有词法范围(interlisp)。因此,Scheme 是第一个具有词法范围的 lisp 语言。是 pair? 刚刚借用了 interlisp consp。从一个有效的词法 lisp 中,您可以使用向量或闭包创建 cons 合约。从实现的内部来看,它可以通过多种其他更有效的方式来完成。引导一个新的 lisp 通常意味着使原语自己工作,因此通常会在宿主语言中实现对。

标签: scheme built-in


【解决方案1】:

我认为您正在寻找“对”的实现?球拍中的原始人。如果是这样:它目前在list.c

https://github.com/racket/racket/blob/master/racket/src/racket/src/list.c

具体看pair_p_prim的定义。

希望这会有所帮助!

编辑:为什么不是用 Racket 写的?

答案:pair? 是 Racket 和 Scheme 中的一个原语。这意味着在 Racket 中,它不是在 Racket 中实现的,而是在实现 Racket 的语言中实现的。对于这部分语言,即 C。请记住,这可以改变;如果更新 Racket 实现以提供一组较低级别的原语,则 pair? 函数可能不再是原语。最后,值得注意的是,对于某些语言,实现者利用旧编译器的存在来提供“引导”实现,其中实现语言与该语言相同 正在开发中。

希望这会有所帮助!

【讨论】:

  • 不,这不是我想要的。我需要该程序如何工作的代码。这是一个例子。内置程序“list?”可以这样定义。 (define (list?p) (if (null?p) true (if (pair?p) (list? (cdr p)) false)))。我需要对过程“pair?”进行相同的定义?
  • 谢谢!这真的很有帮助!
【解决方案2】:

pair?可以在Scheme中实现;计划是图灵完成的,我的朋友!

但是我不会为你做你的硬件并让你头晕目眩,我将使用 Scheme 在 lambda 演算中编码 pair?;从这里,跟着白兔!

cpair? = λm. m (λx. λy. tru) fls

在方案中:

(define c-pair? 
  (lambda (m) 
    ((m (lambda (x) (lambda (y) tru))) (lambda (x) fls))))

(define tru 
  (lambda (t) (lambda (f) t)))

(define fls
  (lambda (t) (lambda (f) f)))

测试程序:

(define kons 
  (lambda (h)
    (lambda (t)
      (lambda (c) 
        (lambda (n)
          ((c h) ((t c) n)))))))

(define c-equal?
  (lambda (m) 
    (lambda (n) 
      ((c-and (iszero ((m prd) n)))
              (iszero ((n prd) m))))))

 (define c-and
   (lambda (b) 
     (lambda (c) 
       ((b c) fls))))

 (define iszero (lambda (m) ((m (lambda (x) fls)) tru))) 

 (define prd (lambda (m) (fst ((m ss) zz))))

 (define fst (lambda (p) (p tru)))

 ;; church-boolean -> real boolean
 (define real-bool (lambda (b) ((b true) false)))

 (define nil (lambda (c) (lambda (n) n)))

 ;; representation of number 1
 (define c1 (lambda (s) (lambda (z) (s z))))

测试:

 ;; some list - in Scheme this would be: (cons 1 '())
 (define d ((kons c1) nil)

 (real-bool ((c-equal? (c-pair? d)) tru)) ;; -> #t
 (real-bool ((c-equal? (c-pair? c1)) fls)) ;; -> #f

换句话说;即使pair? 是一个原语,你也绝对可以在Scheme 中写pair?

【讨论】:

  • 想解释一下吗?我在 Chez 中尝试了代码,但它不起作用。尝试了 Racket 中的trufls(用于判断真假)——fls 不起作用。不过,感谢您的努力。
猜你喜欢
  • 2016-02-05
  • 1970-01-01
  • 2014-12-30
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 2019-05-25
  • 2015-05-30
相关资源
最近更新 更多