This is the mail archive of the kawa@sourceware.org mailing list for the Kawa project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

StackOverflowError in a specialized map


Hello,

i have a custom definition of map ( https://github.com/damien-mattei/LOGIKI/blob/master/lib/map.scm at  line 392):

;; map-nil : a map version that exclude nil results
;; the same as map-with-lambdas but will exclude from the result list the '() result of function
;;
;; (map-nil + '(1 2 3) '(4 5 6)) -> '(5 7 9)
(define map-nil
  (lambda (function list1 . more-lists)
    (letrec ((some? (lambda (fct list)
		      ;; returns #f if (function x) returns #t for 
		      ;; some x in the list
		      (and (pair? list)
			   (or (fct (car list))
			       (some? fct (cdr list)))))))
      
      ;; variadic map implementation terminates
      ;; when any of the argument lists is empty.
      (let ((lists (cons list1 more-lists)))
	(if (some? null? lists)
	    '()
	    (let ((funct-result (apply function (map car lists))))
	      (if (null? funct-result)
		  (apply map-nil function (map cdr lists))
		  (cons funct-result
			(apply map-nil function (map cdr lists))))))))))

i use it in various project since many years and this times it creates a java StackOverflowError on a big list (22527 elements),
i'm not sure if it's only in kawa and java that the problem occur so
i'm near to code this function differently,

the error appears both in a Tomcat web app and at REPL:

 #|kawa:1|# (require 'regex)
#|kawa:2|# (include-relative  "../git/LOGIKI/lib/syntactic-sugar.scm")
#|kawa:3|# (include-relative  "../git/LOGIKI/lib/display.scm")
#|kawa:4|# (include-relative  "../git/LOGIKI/lib/case.scm") ;; for CASE with STRINGS
#|kawa:5|# (include-relative  "../git/LOGIKI/lib/map.scm") ;; for map-nil
/home/mattei/Dropbox/Jkawa/../git/LOGIKI/lib/map.scm:128:12: warning - no declaration seen for remove-last
/home/mattei/Dropbox/Jkawa/../git/LOGIKI/lib/map.scm:128:30: warning - no declaration seen for rest
#|kawa:6|# (include-relative  "../git/LOGIKI/lib/list.scm") ;; for remove-last used by map.scm
/home/mattei/Dropbox/Jkawa/../git/LOGIKI/lib/list.scm:14:10: warning - no declaration seen for rest
/home/mattei/Dropbox/Jkawa/../git/LOGIKI/lib/list.scm:17:32: warning - no declaration seen for rest
/home/mattei/Dropbox/Jkawa/../git/LOGIKI/lib/list.scm:28:22: warning - no declaration seen for first
/home/mattei/Dropbox/Jkawa/../git/LOGIKI/lib/list.scm:29:17: warning - no declaration seen for first
/home/mattei/Dropbox/Jkawa/../git/LOGIKI/lib/list.scm:29:51: warning - no declaration seen for rest
/home/mattei/Dropbox/Jkawa/../git/LOGIKI/lib/list.scm:35:25: warning - no declaration seen for first
/home/mattei/Dropbox/Jkawa/../git/LOGIKI/lib/list.scm:35:56: warning - no declaration seen for rest
/home/mattei/Dropbox/Jkawa/../git/LOGIKI/lib/list.scm:39:27: warning - no declaration seen for rest
/home/mattei/Dropbox/Jkawa/../git/LOGIKI/lib/list.scm:62:12: warning - no declaration seen for rest
#|kawa:7|# (include-relative  "../git/LOGIKI/lib/first-and-rest.scm")
#|kawa:8|# (define wds-url "http://ad.usno.navy.mil/wds/Webtextfiles/wdsnewref.txt";)
#|kawa:9|# (define wds-data-str &<{&[wds-url]}) ;; could take a few seconds to GET file
#|kawa:10|# (define wds-data-str-split (regex-split (string #\linefeed) wds-data-str))
#|kawa:11|# (length wds-data-str-split)
22527
#|kawa:12|# (define test1 (map (lambda (x) x) wds-data-str-split)
#|(---:13|# )
#|kawa:14|# (length test1)
22527
#|kawa:15|# (define test2 (map-nil (lambda (x) x) wds-data-str-split))
Exception in thread "main" java.lang.StackOverflowError
        at kawa.lib.lists.isNull(lists.scm:21)
        at kawa.lib.lists.apply1(lists.scm:20)
        at gnu.expr.ModuleBody.applyN(ModuleBody.java:243)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.mapping.ProcedureN.apply2(ProcedureN.java:39)
        at atInteractiveLevel-5.lambda7$V(stdin:10384)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)
        at gnu.expr.ModuleMethod.applyN(ModuleMethod.java:237)
        at gnu.kawa.functions.ApplyToArgs.applyN(ApplyToArgs.java:141)
        at gnu.kawa.functions.Apply.applyN(Apply.java:74)
        at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)
        at atInteractiveLevel-5.lambda7$V(stdin:10396)
        at atInteractiveLevel-5.applyN(stdin:10379)

....


i think the 22527 elements list is too much for some recursion i use in my recursive functions (map-nil),
i'm a bit disappointed about scheme today, i thought my code was robust,but seems not...
it works with the original map ,i'm wondering how map is implemented ? i like coding in a recursive way , should i rewrite this with some iteration?

Regards,

Damien

 
-- 
Damien.Mattei@unice.fr, Damien.Mattei@oca.eu, UNS / OCA / CNRS


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]