gpt4 book ai didi

scheme - 你如何在 Scheme 中返回一个过程的描述?

转载 作者:行者123 更新时间:2023-12-04 23:22:24 28 4
gpt4 key购买 nike

假设我有这样的事情:

(define pair (cons 1 (lambda (x) (* x x))

如果我想返回这对的前对象,我会这样做:
(car pair)

它返回 1。但是当对象是一个过程时,我没有得到它的确切描述。
换句话说:
(cdr pair)

返回 #<procedure>而不是 (lambda (x) (*x x)) .

我该如何解决?

最佳答案

尽管通常无法做到这一点,但您可以为您定义的过程装配一些东西来做到这一点。

  • Racket struct s 可以定义一个 prop:procedure这允许将结构作为过程应用(调用)。相同的结构可以保存函数定义的原始语法的副本。这就是sourced结构正在做,下面。
  • write-sourced东西只是为了使输出更干净(仅显示原始的 sexpr,而不是其他结构字段)。
  • define-proc宏使初始化结构变得更简单——您不需要两次键入代码并希望它匹配。它为你做这件事。

  • #lang racket

    (require (for-syntax racket/syntax))

    ;; Optional: Just for nicer output
    (define (write-sourced x port mode)
    (define f (case mode
    [(#t) write]
    [(#f) display]
    [else pretty-print])) ;nicer than `print` for big sexprs
    (f (sourced-sexpr x) port))

    (struct sourced (proc sexpr)
    #:property prop:procedure (struct-field-index proc)
    ;; Optional: Just to make cleaner output
    #:methods gen:custom-write
    [(define write-proc write-sourced)])

    ;; A macro to make it easier to use the `sourced` struct
    (define-syntax (define-proc stx)
    (syntax-case stx ()
    [(_ (id arg ...) expr ...)
    #'(define id (sourced (lambda (arg ...) expr ...)
    '(lambda (arg ...) expr ...)))]))

    ;; Example
    (define-proc (foo x)
    (add1 x))

    (foo 1) ; => 2
    foo ; => '(lambda (x) (add1 x))

    关于scheme - 你如何在 Scheme 中返回一个过程的描述?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20349543/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com