Ai
21 Star 49 Fork 0

Gitee 极速下载/julia-language

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
此仓库是为了提升国内下载速度的镜像仓库,每日同步一次。 原始仓库: https://github.com/JuliaLang/julia
克隆/下载
utils.scm 3.84 KB
一键复制 编辑 原始数据 按行查看 历史
Em Chu 提交于 2025-02-21 06:25 +08:00 . lowering: Don't mutate lambda in linearize (#57416)
;; for debugging, display x and return it
(define (prn x)
(with-output-to *stderr*
(display x) (newline))
x)
;; return the mapping for `elt` in `alst`, or `default` if not found
(define (lookup elt alst default)
(let ((a (assq elt alst)))
(if a (cdr a) default)))
;; items in `s1` and not in `s2`
(define (diff s1 s2)
(cond ((null? s1) '())
((memq (car s1) s2) (diff (cdr s1) s2))
(else (cons (car s1) (diff (cdr s1) s2)))))
(define (intersect s1 s2)
(filter (lambda (x) (memq x s2)) s1))
(define (has-dups lst)
(if (null? lst)
#f
(or (memq (car lst) (cdr lst))
(has-dups (cdr lst)))))
;; does `expr` contain any substructure that satisfies predicate `p`?
(define (contains p expr)
(or (p expr)
(and (pair? expr)
(any (lambda (x) (contains p x))
expr))))
;; does `expr` contain something `eq?` to `x`, excluding list heads and quoted exprs
(define (expr-contains-eq x expr)
(or (eq? expr x)
(and (pair? expr)
(not (quoted? expr))
(any (lambda (y) (expr-contains-eq x y))
(cdr expr)))))
;; same as above, with predicate
(define (expr-contains-p p expr (filt (lambda (x) #t)))
(and (filt expr)
(or (p expr)
(and (pair? expr)
(not (quoted? expr))
(any (lambda (y) (expr-contains-p p y filt))
(cdr expr))))))
(define (expr-replace p expr repl)
(cond ((p expr) (repl expr))
((and (pair? expr) (not (quoted? expr)))
(cons (car expr)
(map (lambda (x) (expr-replace p x repl)) (cdr expr))))
(else expr)))
;; find all subexprs satisfying `p`, applying `key` to each one
(define (expr-find-all p expr key (filt (lambda (x) #t)))
(if (filt expr)
(let ((found (if (p expr)
(list (key expr))
'())))
(if (or (atom? expr) (quoted? expr))
found
(apply nconc
found
(map (lambda (x) (expr-find-all p x key filt))
(cdr expr)))))
'()))
(define (butlast lst)
(if (or (null? lst) (null? (cdr lst)))
'()
(cons (car lst) (butlast (cdr lst)))))
(define (last lst)
(if (null? (cdr lst))
(car lst)
(last (cdr lst))))
(define (take-while f xs)
(cond ((null? xs) '())
((f (car xs)) (cons (car xs) (take-while f (cdr xs))))
(else '())))
(define (caddddr x) (car (cdr (cdr (cdr (cdr x))))))
(define (cdddddr x) (cdr (cdr (cdr (cdr (cdr x))))))
(define (cadddddr x) (car (cdddddr x)))
(define (table.clone t)
(let ((nt (table)))
(table.foldl (lambda (k v z) (put! nt k v))
() t)
nt))
;; `any`, but call predicate on every element in order no matter what
(define (eager-any pred lst)
(let loop ((lst lst)
(any #f))
(if (null? lst)
any
(loop (cdr lst)
(or (pred (car lst)) any)))))
;; construct a table mapping each element of `lst` to its index (1-indexed)
(define (symbol-to-idx-map lst)
(let ((tbl (table)))
(let loop ((xs lst) (i 1))
(if (pair? xs)
(begin (put! tbl (car xs) i)
(loop (cdr xs) (+ i 1)))))
tbl))
;; keep at most the first element matching a given predicate
(define (keep-first pred lst)
(cond ((null? lst) lst)
((pred (car lst))
(cons (car lst) (filter (lambda (x) (not (pred x))) (cdr lst))))
(else
(cons (car lst) (keep-first pred (cdr lst))))))
(define (take lst n)
(let loop ((lst lst) (n n) (out '()))
(if (= n 0) (reverse out)
(loop (cdr lst) (- n 1) (cons (car lst) out)))))
(define (drop lst n)
(if (= n 0) lst
(drop (cdr lst) (- n 1))))
;; functional update at position i
(define (list-set lst i val)
(append (take lst i) (list val) (drop lst (+ i 1))))
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/mirrors/julia-language.git
git@gitee.com:mirrors/julia-language.git
mirrors
julia-language
julia-language
master

搜索帮助