2013-03-21 2 views
1

Я использую переводчик схемы в JavaScriptслишком много схемы рекурсии Javascript

Я получаю ошибку «слишком много рекурсии», когда я пытаюсь этот код:

;;;basic things 
(define map 
    (lambda (f l) 
    (if (null? l) l 
     (cons (f (car l)) (map f (cdr l)))))) 

(define filter 
    (lambda (p l) 
    (if (null? l) l 
     (if (p (car l)) 
      (cons (car l) (filter p (cdr l))) 
      (filter p (cdr l)))))) 

(define accumulate 
    (lambda (op initial sequence) 
    (if (null? sequence) 
     initial 
     (op (car sequence) 
     (accumulate op initial (cdr sequence)))))) 

(define reduce 
    (lambda (op sequence) 
    (accumulate op (car sequence) (cdr sequence)))) 

(define append 
    (lambda (l1 l2) 
    (if (null? l2) l1 
     (append (cons (car l2) l1) (cdr l2))))) 

(define make-list 
    (lambda (n f l) 
    (if (= n 0) l 
     (make-list (- n 1) f (cons (f n) l))))) 

(define make-list2- 
    (lambda (f n1 n2 l) 
    (if (> n1 n2) l 
     (make-list2- f (+ n1 1) n2 (cons (f n1) l))))) 
(define make-list2 (lambda (f n1 n2) (make-list2- f n1 n2 null))) 
(define identity (lambda (x) x)) 
(define randomitem (lambda (l) (nth (ceil (* (random) (length l))) l))) 
;;; 

(define random0to3 (lambda() (floor (* 4 (random))))) 

(define moverandom (lambda (this) (move this (random0to3)))) 

(define searchforcreature 
    (lambda (this cx cy) ;search only for neighbor tiles 
    (begin (define y (make-list2 identity (- cy 5) (+ cy 5))) 
     (define L (map (lambda (x) (map (lambda (y2) (cons x y2)) y)) 
      (make-list2 identity (- cx 5) (+ cx 5)))) 
     (define L2 (reduce append L)) 
     (define listoftiles (map (lambda (x) (tile-from-pos (car x) (cdr x))) L2)) 
     (define listoftiles2 (filter identity listoftiles)) ;remove the falses you get from trying invalid positions 
     (define listofcreatures (filter (lambda (x) (and (creature? x) (not (= x this)))) (map topthing listoftiles2))) 
     ;(pairtostring listofcreatures) 
     (if (null? listofcreatures) 
      #f 
      (car listofcreatures))))) 

(define update 
    (lambda (this world) 
    (begin 
     (define target (searchforcreature this (creature-x this) (creature-y this))) 
     (begin (print target) 
     (if target 
      (attack this target) 
      (moverandom this)))))) 

, но с 10 вместо 5 в функции searchforcreatures, , что означает, что я создаю список из 400 элементов, а затем сопоставляю их с функцией tile-from-pos , но когда я тестировал одну и ту же функцию в drScheme, она работала нормально, это потому, что javascript не оптимизирует для рекурсии?

моя игра, где вы можете проверить код выше: thesamesite/textarea.html

основной код для игры, в схеме: thesamesite/env0.sc

+0

Пожалуйста, не связывайтесь с вашим кодом в будущем. Кроме того, я, возможно, сломал несколько вкладок ... –

ответ

2

реализации Схемы необходимы для оптимизации хвоста, так что рекурсия выполняется в постоянном пространстве. Скорее всего, если ваш код хвост рекурсивный, «интерпретатор» на основе Javascript не выполняет эту оптимизацию. [Фактически, вероятно, с учетом того, что оптимизация будет выполнена во время компиляции и менее вероятна во время интерпретации.]

+0

Как мне сделать оптимизацию? вот он: http://schemerobots.comlu.com/lispy.js – affiszervmention

+0

Невозможно выполнить оптимизацию хвостовых вызовов. – GoZoner

+0

, когда я пытаюсь использовать тот же код в http://repl.it/, он не дает ошибки, но дает правильный результат, так что они не оптимизированы? – affiszervmention

Смежные вопросы