Scheme 在具有条件的方案(R5RS)上应用操作
我正在尝试创建一个Scheme程序(语言R5RS),它根据列表上的数字有多大,对一组列表应用一个操作 所以函数看起来像Scheme 在具有条件的方案(R5RS)上应用操作,scheme,racket,r5rs,Scheme,Racket,R5rs,我正在尝试创建一个Scheme程序(语言R5RS),它根据列表上的数字有多大,对一组列表应用一个操作 所以函数看起来像 (apply-function f g) 条件是,如果f(ab)中a
(apply-function f g)
条件是,如果f(ab)中a<5,则应用操作f(ab)
但如果a等于或大于5,则应用g(ab)。(第二次操作)
这听起来令人困惑,但一个直观的例子应该可以澄清这一点:因此,一个例子是
((apply-function '* '+) '((2 3) (8 6)))
将返回:
'(6 14)
另一个例子是
((apply-function '* '+) '((5 7) (2 3) (3 3))
返回
'(12 6 9)
我以前处理过这个计划的操作,但条件部分把我甩了,我不知道从哪里开始。感谢您的帮助 版本1:如果使用过程+
和*
而不是符号'+
和'*
:
#lang r5rs
(define apply-function
(lambda (f g)
(lambda (lop)
(map (lambda (p)
(if (< (car p) 5)
(f (car p) (cadr p))
(g (car p) (cadr p))))
lop))))
(display ((apply-function * +) '((2 3) (8 6))))
(newline)
(display ((apply-function * +) '((5 7) (2 3) (3 3))))
#lang r5rs
(定义应用函数)
(λ(f g)
(lambda(lop)
(地图(lambda(p)
(如果(<(车辆p)5)
(f(p车)(p车)
(g(汽车p)(cadr p)))
(lop)
(显示((应用函数*+)'((2 3)(8 6)))
(新行)
(显示((应用函数*+)'((57)(23)(33)))
版本2:您可以创建一个关联列表,将符号与过程相匹配
#lang r5rs
(define proc-list `((* . ,*) (+ . ,+)))
(define (get-proc s)
(let ((p (assq s proc-list)))
(if p (cdr p) s)))
(define apply-function
(lambda (f g)
(lambda (lop)
(map (lambda (p)
(if (< (car p) 5)
((get-proc f) (car p) (cadr p))
((get-proc g) (car p) (cadr p))))
lop))))
(display ((apply-function '* '+) '((2 3) (8 6))))
(newline)
(display ((apply-function '* '+) '((5 7) (2 3) (3 3))))
#lang r5rs
(定义进程列表“(*,*)(+,+))
(定义(获取进程)
(let((p(assq s程序列表)))
(如果p(cdr p)s)))
(定义应用函数)
(λ(f g)
(lambda(lop)
(地图(lambda(p)
(如果(<(车辆p)5)
((获取程序f)(车辆p)(cadr p))
((获取过程)(车辆p)(cadr p)))
(lop)
(显示((应用函数“*”+)”((23)(86)))
(换行)
(显示((应用函数“*”+)”((57)(23)(33)))
版本3:使用eval
#lang r5rs
(define (my-eval e)
(eval e (scheme-report-environment 5)))
(define apply-function
(lambda (f g)
(lambda (lop)
(map (lambda (p) (if (< (car p) 5)
(my-eval (list f (car p) (cadr p)))
(my-eval (list g (car p) (cadr p)))))
lop))))
(display ((apply-function '* '+) '((2 3) (8 6))))
(newline)
(display ((apply-function '* '+) '((5 7) (2 3) (3 3))))
#lang r5rs
(定义(我的评估)
(评估e(方案报告环境5)))
(定义应用函数)
(λ(f g)
(lambda(lop)
(地图(lambda(p)(如图(p)5)
(我的评估(列表f(车辆p)(cadr p)))
(我的评估(清单g(汽车p)(cadr p()))))
(lop)
(显示((应用函数“*”+)”((23)(86)))
(新行)
(显示((应用函数“*”+)”((57)(23)(33)))
假设过程被给出为*
和+
那么,对这样一个子列表的操作如下所示
(lambda (e) (if (< (car e) 5)
(* (car e) (cadr e))
(+ (car e) (cadr e)))
并再次抽象出程序:
(define (apply-function f g)
(lambda (ls) (map (apply-once f g) ls)))
如果您假定不必在函数名和函数之间映射,那么一个明显的定义是使用
apply
:
(define (apply-function f g)
(lambda (l)
(map (lambda (e)
(apply (if (< (car e) 5) f g) e))
l)))
(定义(应用函数f g)
(λ(l)
(兰姆达(东)地图)
(适用于(如果(<(e车)5)f g)e)
l) ))
(define (apply-function f g)
(lambda (ls) (map (apply-once f g) ls)))
(define (apply-function f g)
(lambda (l)
(map (lambda (e)
(apply (if (< (car e) 5) f g) e))
l)))