从列表提取lambda函数传入其他函数时出现应用错误的咨询
问题原因
你遇到的核心问题是:被quote(')包裹的列表里,lambda表达式只是一个字面数据结构,不是可调用的过程。
当你写'((0 4) (lambda (x) (+ x 100)))时,整个列表被quote阻止了求值,里面的(lambda (x) (+ x 100))只是由lambda符号、参数列表、体表达式组成的嵌套列表,并没有被Scheme转换成实际可调用的过程。而直接写(lambda (x) (+ x 100))时,Scheme会自动求值这个表达式,得到一个可以应用参数的过程,所以能正常运行。
解决办法
有两种常用方案,根据你的场景选择:
方案1:用list构造列表(推荐)
不要用quote包裹整个列表,改用list函数构造,这样里面的lambda表达式会被正常求值为过程:
(define my-list (list '(0 4) (lambda (x) (+ x 100)))) (define my-proc (car (cdr my-list))) ; 现在my-proc就是可调用的过程,传入其他函数或直接调用都没问题 (my-proc 5) ; 返回105
方案2:对取出的表达式求值(适用于必须保留quote列表的场景)
如果你的列表是从外部读取的静态数据,必须保留quote形式,可以用eval对取出的lambda表达式进行求值,将其转换为过程:
(define my-list '((0 4) (lambda (x) (+ x 100)))) (define my-proc (eval (car (cdr my-list)) (current-environment))) ; 现在my-proc可以正常使用 (my-proc 10) ; 返回110
注意:eval会执行传入的表达式,处理不可信数据时要谨慎,但如果是你自己构造的列表,完全没问题。
内容的提问来源于stack exchange,提问作者Patrick C
相关产品推荐
相关产品推荐

