内置Scheme程序的代码"pair?"

The code of the build-in Scheme procedure "pair?"

我开始研究 Scheme 并对内置过程 "pair?" 的工作原理感到好奇。我的意思显然是代码,因为我找不到查看内置程序代码的方法,也不知道如何编写代码,所以我来了。 对 "List?" 程序有同样的问题,但自己设法编写了它,但如果 "pair?" 不知道。谢谢!

我认为您正在寻找 Racket 中 'pair?' 原语的实现。如果是:它目前在 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? 函数可能不再是原语。最后,值得注意的是,对于某些语言,实现者利用旧编译器的存在来提供 'bootstrapping' 实现,其中实现语言与语言相同 正在开发中。

希望对您有所帮助!

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

换句话说;你绝对可以在 Scheme 中写 pair?,即使 pair? 是原始类型。