From e931fcabb0dd0bb1dec15ee23706aaf57e67955b Mon Sep 17 00:00:00 2001 From: walking-octopus Date: Thu, 17 Apr 2025 23:14:37 +0300 Subject: [PATCH 1/2] perf: optimize scanl --- main.rkt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/main.rkt b/main.rkt index 6904088..abd6c65 100644 --- a/main.rkt +++ b/main.rkt @@ -115,12 +115,15 @@ (define (scanl proc lst) - (foldl - (λ (val acc) - (append acc (list (proc val (last acc))))) - (list (first lst)) - (rest lst))) - + (let loop [(acc (list (car lst))) + (val (car lst)) + (rest (cdr lst))] + (if (empty? rest) + (reverse acc) + (let [(next (proc val (car rest)))] + (loop (cons next acc) + next (cdr rest)))))) + (define (scanr proc lst) (foldl From eafd15b473b2bbfdc955a3184bbfe84e9baa4aac Mon Sep 17 00:00:00 2001 From: walking-octopus Date: Thu, 17 Apr 2025 23:56:33 +0300 Subject: [PATCH 2/2] feat: optional seed for scanl --- main.rkt | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/main.rkt b/main.rkt index abd6c65..236209e 100644 --- a/main.rkt +++ b/main.rkt @@ -114,15 +114,20 @@ [else (tail-call lst)])) -(define (scanl proc lst) - (let loop [(acc (list (car lst))) - (val (car lst)) - (rest (cdr lst))] - (if (empty? rest) - (reverse acc) - (let [(next (proc val (car rest)))] - (loop (cons next acc) - next (cdr rest)))))) +(define scanl + (case-lambda + [(proc lst) + (scanl proc (car lst) (cdr lst))] + [(proc seed lst) + (let loop ([acc (list seed)] + [val seed] + [rest lst]) + (if (empty? rest) + (reverse acc) + (let ([next (proc val (car rest))]) + (loop (cons next acc) + next + (cdr rest)))))])) (define (scanr proc lst)