Lambda “在方案中获取错误”;对象(unquote f),作为参数传递给标识符->;符号,不是标识符。”;

Lambda “在方案中获取错误”;对象(unquote f),作为参数传递给标识符->;符号,不是标识符。”;,lambda,functional-programming,scheme,function-composition,mit-scheme,Lambda,Functional Programming,Scheme,Function Composition,Mit Scheme,我试图实现一个函数composex,该函数给定一个函数列表funcs返回一个函数,该函数是funcs中所有函数的组合 所以 输入->[f1 f2 f3…] 输出->f'(x)=f1(f2(f3(…(x))) 我的代码片段是: (define (reducex initial f arr) (if (null? arr) initial (reducex (f initial (car arr)) f (cdr arr) ) ) ) (d

我试图实现一个函数
composex
,该函数给定一个函数列表
funcs
返回一个函数,该函数是
funcs
中所有函数的组合 所以

输入->[f1 f2 f3…]
输出->f'(x)=f1(f2(f3(…(x)))

我的代码片段是:

(define (reducex initial f arr)
  (if (null? arr)
    initial
    (reducex (f initial (car arr))
      f
      (cdr arr)
    )
  )
)


(define (abst x)
  (if (< x 0)
    (- x)
    x
  )
)

(define (mult2 x)
  (* x 2))

(define (composex funcs)
  (lambda (x)
    (reducex '()
      (lambda (ini, f) (f x))
      funcs)
  )
)

(define absmult2 (composex (cons abst (cons mult2 '()))))
(absmult2 2)
(absmult2 -2)

我正在使用mit scheme执行。

简易修复,IIUC:在参数列表中为内部
lambda添加逗号。把它拿出来

逗号在Scheme中有特殊的含义;它可以让你从一个准单眼中“逃脱”。在本例中,您并没有使用Quasikote,所以这里的逗号在Scheme中没有任何意义


这是一条非常糟糕的错误消息。

简易修复,IIUC:您在参数列表中为内部
lambda添加了一个逗号。把它拿出来

逗号在Scheme中有特殊的含义;它可以让你从一个准单眼中“逃脱”。在本例中,您并没有使用Quasikote,所以这里的逗号在Scheme中没有任何意义

不过,这是一条非常糟糕的错误消息。

在本部分中:

(lambda(ini,f)(fx))
现在,我不确定您是否错误地用
或某个疯狂的巧合将参数分隔开来,希望
ini,
作为参数的名称,但是
在Quasikote表达式中使用:

(定义一个10)
(定义b 20)
`(插入,a和,(+a b)的列表)
; ==> (插入10和30的列表)
就像
一样,这些都是由读卡器宏处理的。因此,正如
'x
(quote x)
`(,x)
(quasiquete((unquote x))
quote
Quoasiquete
unquote
是特殊形式。您的lamba最终看起来像:

(lambda(ini(unquote f))(fx))
MIT Scheme不支持可选参数,只有
ini
f
等符号可以在lamba列表中,而不是列表
(unquote f)
。因此,您需要将其更改为:

(lambda(ini f)(f x))
编辑

您的
reducex
foldl
相同,只是其中的参数顺序和所使用的函数不同。例如

(折叠cons'()'(1 2 3));=>(3 2 1)
(reducex’()(lambda(ae)(cons e a))’(1 2 3));=>(3 2 1)
您的
compose
以错误的顺序执行应用程序,这类函数通常采用可变数量的参数。例如

((撰写-+)35)
; ==> -8.
以下是我认为您需要做的:

(定义(compose.funcs)
(大小写)
((0)(lambda(v)v));身份
((1)(car funcs));返回参数
(否则;返回一篇作文
(let*((RFUNC(反向函数))
(初始职能(车辆RFUNC))
(其余职能部门(cdr RFUNC))
(减少(λ(fn a)(fn a)))
(λargs)
(foldl-reduce)
(应用初始函数参数)
休息时间()()()))
因此,让我们用顺序重要的东西来测试它:

(定义(添加100伏)(+100伏))
(定义(双v)(*v2))
(定义(手动编写)
(双(加100 v)))
(定义测试组合(组合双加100))
(手册50)
; ==> 300
(测试50)
; ==> 300
如果按照您的
composex
顺序进行合成,则应答器应该是
200
compose
支持最右边函数的arity,因此首先应用的函数。如果是thunk,则结果函数可以是零参数,如果是多个arity one,它将成为多个arity函数:

(定义双精度+(合成双精度+)
(双倍+3892)
; ==> 44
在本部分中:

(lambda(ini,f)(fx))
现在,我不确定您是否错误地用
或某个疯狂的巧合将参数分隔开来,希望
ini,
作为参数的名称,但是
在Quasikote表达式中使用:

(定义一个10)
(定义b 20)
`(插入,a和,(+a b)的列表)
; ==> (插入10和30的列表)
就像
一样,这些都是由读卡器宏处理的。因此,正如
'x
(quote x)
`(,x)
(quasiquete((unquote x))
quote
Quoasiquete
unquote
是特殊形式。您的lamba最终看起来像:

(lambda(ini(unquote f))(fx))
MIT Scheme不支持可选参数,只有
ini
f
等符号可以在lamba列表中,而不是列表
(unquote f)
。因此,您需要将其更改为:

(lambda(ini f)(f x))
编辑

您的
reducex
foldl
相同,只是其中的参数顺序和所使用的函数不同。例如

(折叠cons'()'(1 2 3));=>(3 2 1)
(reducex’()(lambda(ae)(cons e a))’(1 2 3));=>(3 2 1)
您的
compose
以错误的顺序执行应用程序,这类函数通常采用可变数量的参数。例如

((撰写-+)35)
; ==> -8.
以下是我认为您需要做的:

(定义(compose.funcs)
(大小写)
((0)(lambda(v)v));身份
((1)(car funcs));返回参数
(否则;返回一篇作文
(let*((RFUNC(反向函数))
(初始职能(车辆RFUNC))
(其余职能部门(cdr RFUNC))
(减少(λ(fn a)(fn a)))
(λargs)
(foldl-reduce)
(应用初始函数参数)
休息时间()()()))
因此,让我们用顺序重要的东西来测试它:

;The object (unquote f), passed as an argument to identifier->symbol, is not an identifier. ;To continue, call RESTART with an option number: ; (RESTART 1) => Return to read-eval-print level 1.
(define (composex funcs)
  (lambda (x)
    (reducex '()
             (lambda (ini f) (f x))
             funcs)))

(define foo (composex '()))
(foo 'x) ; => '()
(absmult2 2) ; 4
(absmult2 -2) ; -4
(let ((ini '()))
  (set! ini (abst -2))
  (set! ini (mult2 -2))
  ini) ;; -4
(let ((ini -2))
  (set! ini (abst ini))
  (set! ini (mult2 ini))
  ini) ;; 4
(define (composex funcs)
  (lambda (ini)
    (reducex ini
             (lambda (x f) (f x))
             funcs)))

(absmult2 2) ; 4
(absmult2 -2) ; 4
(define foo (composex '()))
(foo 'z) ; 'z
(define absmult2 (composex `(,abst ,mult2)))

(absmult2 2)  ; 4
(absmult2 -2) ; 4
(define (composex . funcs)
  (lambda (ini)
    (reducex ini
             (lambda (x f) (f x))
             funcs)))

(define absmult2 (composex abst mult2))

(absmult2 2)  ; 4
(absmult2 -2) ; 4
(define (composex . fs)
  ;; simplified composition of two functions
  (define (comp f g)
    (lambda (x) (g (f x))))
  ;; results in simplified reduce
  (reducex identity comp fs))

(define absmult2 (composex abst mult2))

(absmult2 2)  ; 4
(absmult2 -2) ; 4
(define (composex f . fs)
  (lambda (x)
    (if (null? fs)
        (f x)
        ((apply composex fs) (f x)))))

(define absmult2 (composex abst mult2))

(absmult2 2)  ; 4
(absmult2 -2) ; 4