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