Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 在具有条件的方案(R5RS)上应用操作_Scheme_Racket_R5rs - Fatal编程技术网

Scheme 在具有条件的方案(R5RS)上应用操作

Scheme 在具有条件的方案(R5RS)上应用操作,scheme,racket,r5rs,Scheme,Racket,R5rs,我正在尝试创建一个Scheme程序(语言R5RS),它根据列表上的数字有多大,对一组列表应用一个操作 所以函数看起来像 (apply-function f g) 条件是,如果f(ab)中a

我正在尝试创建一个Scheme程序(语言R5RS),它根据列表上的数字有多大,对一组列表应用一个操作

所以函数看起来像

(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)))