本地过程是否可以在不使用lambda的情况下绑定到letrec中的变量?

本地过程是否可以在不使用lambda的情况下绑定到letrec中的变量?,lambda,scheme,racket,letrec,Lambda,Scheme,Racket,Letrec,我是这个计划的初学者。我曾经在使用letrec和使用lambda进行绑定时执行过类似的程序 (define (drop l n) (letrec ((iter (lambda(ls x) (cond ((null? ls) ls) ((> x 1) (cons (car ls) (iter (cdr ls) (- x 1)))) (else (iter (cdr ls) n)))))) (iter l n))) (define factorial

我是这个计划的初学者。我曾经在使用letrec和使用lambda进行绑定时执行过类似的程序

(define (drop l n)
  (letrec ((iter (lambda(ls x)
  (cond ((null? ls) ls)
        ((> x 1) (cons (car ls) (iter (cdr ls) (- x 1))))
        (else (iter (cdr ls) n)))))) (iter l n)))

(define factorial
  (lambda (n)
    (letrec ((iter
              (lambda (product counter)
                (if (> counter n)
                    product
                    (iter (* counter product)
                          (+ counter 1))))))
      (iter 1 1)))

但我最近发现,我们学院的评估机构不允许使用“lambda”结构。不管怎样,不使用lambda也可以解决类似的问题吗?请推荐其他选择。

让我们看看一些变化(都在球拍中)

首先是你的原创作品:

#lang racket
(define factorial
  (lambda (n)
    (letrec ((iter
              (lambda (product counter)
                (if (> counter n)
                    product
                    (iter (* counter product)
                          (+ counter 1))))))
      (iter 1 1))))

(factorial 5)
第一个
lambda
很容易隐藏:

(define (factorial2 n)
    (letrec ((iter
              (lambda (product counter)
                (if (> counter n)
                    product
                    (iter (* counter product)
                          (+ counter 1))))))
      (iter 1 1)))

(factorial2 5)
内部定义和
letrec
等效:

(define (factorial3 n)
  (define (iter product counter)
    (if (> counter n)
        product
        (iter (* counter product)
              (+ counter 1))))
  (iter 1 1))

(factorial3 5)
如果您使用其中一种教学语言(用于HtDP),则内部定义称为本地定义-您必须使用
local
结构:

(define (factorial4 n)
  (local [(define (iter product counter)
            (if (> counter n)
                product
                (iter (* counter product)
                      (+ counter 1))))]
    (iter 1 1)))

(factorial4 5)

您可以使用内部的
define
,它允许您在不使用单词
lambda
的情况下定义函数。有趣的事实:在禁用宏隐藏的情况下运行宏步进器所有这些看起来都像OPs的原始版本。@sylwester OP没有说,但我猜“没有lambda”意味着该类正在使用BSL(第一种没有显式lambda的教学语言)。我发现“无lambda”是球拍程序的一个特殊要求。@soegaard如果你直接给它加上一个名字,没有lambda会更简洁。。