2015-08-17 2 views
2

Я новичок в схеме. Я использовал такие программы, используя letrec и binding, используя lambda.Может ли локальная процедура быть связана с переменной в letrec без использования лямбда?

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

Но недавно я обнаружил, что оценочные органы в нашем колледже не позволяют использовать конструкцию «лямбда». В любом случае, подобные проблемы могут быть выполнены без использования лямбда? Пожалуйста, предложите любые другие альтернативы.

+3

Вы можете использовать внутренний 'define', который позволяет определить функцию без использования слова' lambda'. –

ответ

2

Давайте рассмотрим несколько вариантов (все в Racket).

Первый оригинал:

#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) 
+0

Спасибо, что решил мое сомнение :) –

+0

Я вижу лямбду всюду в этих примерах. Удовлетворительный факт. Запуск макро шагомера с отключением макросъемки все они выглядят как оригинальная версия OP. – Sylwester

+0

@sylwester OP не сказал, но я предполагаю, что «no lambda» означает, что класс использует BSL ​​(первый язык обучения без явного лямбда). Я считаю «отсутствие лямбды» своеобразным требованием к программе Racket. – soegaard