Changeset 12836 in project
 Timestamp:
 12/17/08 08:56:46 (13 years ago)
 Location:
 release/3/nemo/trunk
 Files:

 3 edited
Legend:
 Unmodified
 Added
 Removed

release/3/nemo/trunk/nemocore.scm
r12835 r12836 17 17 ;; <http://www.gnu.org/licenses/>. 18 18 ;; 19 ;; TODO: * check that open states in state complexes are valid 19 ;; TODO: * check that open states in reactions are valid 20 ;; * check that reactions do not specify more than 21 ;; one transition between any two states 20 22 ;; 21 23 … … 44 46 nemo:rhs? nemo:lineq? nemo:substterm nemo:binding? nemo:bind 45 47 evalnemosystemdecls 46 REACTION ASGN CONSTPRIM))48 CONST ASGN REACTION RATE PRIM)) 47 49 48 50 ; … … 110 112 (definedatatype nemo:quantity nemo:quantity? 111 113 (SYSNAME (name symbol?)) 114 (CONST (name symbol?) (value number?)) 112 115 (ASGN (name symbol?) (value number?) (rhs rhs?) ) 113 (CONST (name symbol?) (value number?)) 114 (REACTION (name symbol?) 116 (REACTION (name symbol?) 115 117 (initial (lambda (x) (or (rhs? x) (not x)))) 116 118 (open (lambda (x) (or (symbol? x) (and (list? x) (every symbol? x) )))) … … 118 120 (conserve (lambda (x) (or (not x) (and (list? x) (every lineq? x))))) 119 121 (power integer?)) 122 (RATE (name symbol?) 123 (initial (lambda (x) (or (rhs? x) (not x)))) 124 (rhs rhs?)) 120 125 (PRIM (name symbol?) (value identity)) 121 126 (EXTERNAL (localname symbol?) (name symbol?) (namespace (optional symbol?))) 122 (DISPATCH (value procedure?))123 127 (EXPORTS (lst (lambda (x) (and (list? x) (every symbol? x))))) 124 128 (COMPONENT (name symbol?) (type symbol?) (lst (lambda (x) (and (list? x) (every symbol? x))))) 125 129 (FUNCTOR (name symbol?) (args (lambda (x) (and (list? x) (every symbol? x)))) (type symbol?) (decls list?)) 130 (DISPATCH (value procedure?)) 126 131 ) 127 132 … … 376 381 (environmentextend! nemoenv sym (CONST name initial)))) 377 382 383 (('asgn) (let ((rhs (lookupdef 'rhs alst))) 384 (if (not (eq? initial 'none)) 385 (nemo:error 'envextend! 386 ": state function definitions must have initial value of '(none)")) 387 (if (not rhs) 388 (nemo:error 'envextend! ": state function definitions require an equation")) 389 (environmentextend! nemoenv sym (ASGN name 0.0 (normalizeexpr rhs))))) 390 391 (('rate) (let ((rhs (lookupdef 'rhs alst)) 392 (initial (lookupdef 'initial alst))) 393 394 (if (not (rhs? rhs)) 395 (nemo:error 'envextend! ": rate law definitions require an equation")) 396 (if (not (rhs? initial) ) 397 (nemo:error 'envextend! ": rate law definitions require an initial value or expression")) 398 399 (environmentextend! nemoenv sym (RATE name initial (normalizeexpr rhs))))) 400 378 401 (('tscomp) (begin 379 402 (let ((power (or (lookupdef 'power alst) 1)) … … 405 428 (environmentextend! nemoenv sym en))))) 406 429 407 (('asgn) (let ((rhs (lookupdef 'rhs alst)))408 (if (not (eq? initial 'none))409 (nemo:error 'envextend!410 ": state function definitions must have initial value of '(none)"))411 (if (not rhs)412 (nemo:error 'envextend! ": state function definitions require an equation"))413 (environmentextend! nemoenv sym (ASGN name 0.0 (normalizeexpr rhs)))))414 430 415 431 (else (begin … … 620 636 (ss2 (map (lambda (x) (list name x)) ss1))) 621 637 (append ss2 ax))) 638 (RATE (name initial rhs) (cons name ax)) 622 639 (else ax)) 623 640 ax))) … … 636 653 (list) (environmentsymbols nemoenv))) 637 654 655 656 (define (rates nemoenv) 657 (filtermap (lambda (sym) 658 (let ((x (environmentref nemoenv sym))) 659 (and (nemo:quantity? x) 660 (cases nemo:quantity x 661 (RATE (name value rhs) name) 662 (else #f))))) 663 (environmentsymbols nemoenv))) 638 664 639 665 (define (asgns nemoenv) … … 670 696 (fprintf out " value: ~a\n" value))) 671 697 672 (REACTION (name initial open transitions conserve power)673 (begin674 (fprintf out "~a: transition state complex\n" name)675 (fprintf out " initial value: ~a\n" initial)))676 677 698 (CONST (name value) 678 699 (begin … … 685 706 (fprintf out " value: ~a\n" value))) 686 707 708 (REACTION (name initial open transitions conserve power) 709 (begin 710 (fprintf out "~a: transition state complex\n" name) 711 (fprintf out " initial value: ~a\n" initial))) 712 713 (RATE (name initial rhs) 714 (begin 715 (fprintf out "~a: rate law\n" name) 716 (fprintf out " rhs: ~a\n" rhs))) 717 687 718 (else (nemo:error 'exam name ": unknown type of quantity")))))))) 688 719 … … 715 746 (cases nemo:quantity x 716 747 (REACTION (name initial open transitions) #t) 748 (RATE (name initial rhs) #t) 717 749 (else #f)))) 718 750 … … 724 756 (begin 725 757 (map cadddr transitions))) 758 (RATE (name initial rhs) rhs) 726 759 (ASGN (name value rhs) rhs) 727 760 (else #f)))) … … 805 838 (REACTION (name initial open transitions) 806 839 (let ((rs (map cadddr transitions))) 807 (list 'ts sym rs))) 840 (list 're sym rs))) 841 (RATE (name initial rhs) 842 (list 'r sym rhs)) 808 843 (ASGN (name value rhs) 809 844 (list 'a sym rhs)) … … 871 906 ((states) states) 872 907 ((reactions) reactions) 908 ((rates) rates) 873 909 ((defuns) defuns) 874 910 ((consts) consts) … … 951 987 952 988 ;; state transition complex 953 (((or 'reacti ve'REACTION) ((and id (? symbol?)) . alst) )989 (((or 'reaction 'REACTION) ((and id (? symbol?)) . alst) ) 954 990 (let* ((initial (lookupdef 'initial alst)) 955 991 (conserveeq (alistref 'conserve alst)) … … 1001 1037 1002 1038 1039 ;; rate law 1040 (((or 'd 'D) ((and id (? symbol?))) '= (and expr (? expr?) )) 1041 (let* ((qid (computeqid id scope scopesubst)) 1042 (qexpr (substexpr (parseexpr expr) scopesubst))) 1043 (envextend! qid '(rate) 0.0 `(rhs ,qexpr)) 1044 (list (cons qid qs) (updatesubst id qid scopesubst)))) 1045 1003 1046 ;; algebraic assignment 1004 1047 (((and id (? symbol?)) '= (and expr (? expr?) )) 
release/3/nemo/trunk/nemomatlab.scm
r12835 r12836 294 294 295 295 296 (define (poset>stateeqdefs poset sys)297 (foldright298 (lambda (lst ax)299 (fold (lambda (x ax)300 (matchlet (((i . n) x))301 (let ((en (environmentref sys n)))302 (if (nemo:quantity? en)303 (cases nemo:quantity en304 (TSCOMP (name initial open transitions conserve power)305 (append (stateeqs name initial open transitions power) ax))306 (else ax))307 ax))))308 ax lst))309 (list) poset))310 311 312 313 314 296 (define (poset>reactioneqdefs poset sys) 315 297 (foldright … … 320 302 (if (nemo:quantity? en) 321 303 (cases nemo:quantity en 322 ( TSCOMP(name initial open transitions conserve power)323 304 (REACTION (name initial open transitions conserve power) 305 (cons (reactioneq name open transitions) ax)) 324 306 (else ax)) 325 307 ax)))) … … 336 318 (if (nemo:quantity? en) 337 319 (cases nemo:quantity en 338 ( TSCOMP(name initial open transitions conserve power)339 340 (cons* (stateinit name initial)341 (stateinit (matlabstatename name open) name) ax)342 ax))320 (REACTION (name initial open transitions conserve power) 321 (if (nemo:rhs? initial) 322 (cons* (stateinit name initial) 323 (stateinit (matlabstatename name open) name) ax) 324 ax)) 343 325 (else ax)) 344 326 ax)))) … … 355 337 (if (nemo:quantity? en) 356 338 (cases nemo:quantity en 357 ( TSCOMP(name initial open transitions conserve power)358 359 (cons (statelineqs (matlabname name) transitions conserve360 361 ax))339 (REACTION (name initial open transitions conserve power) 340 (if (and (list? conserve) (every nemo:lineq? conserve)) 341 (cons (statelineqs (matlabname name) transitions conserve 342 matlabstatename) ax) 343 ax)) 362 344 (else ax)) 363 345 ax)))) … … 366 348 367 349 368 (define ( statepower sys n)350 (define (reactionpower sys n) 369 351 (let ((en (environmentref sys n))) 370 352 (if (nemo:quantity? en) 371 353 (cases nemo:quantity en 372 ( TSCOMP(name initial open transitions conserve power) power)354 (REACTION (name initial open transitions conserve power) power) 373 355 (else #f)) #f))) 374 356 … … 486 468 (e (car permqs)) 487 469 (gmax (car ((dis 'componentexports) sys (cid pore)))) 488 (pwrs (map (lambda (n) ( statepower sys n)) sts))470 (pwrs (map (lambda (n) (reactionpower sys n)) sts)) 489 471 (sptms (map (lambda (st pwr) `(pow ,st ,pwr)) sts pwrs)) 490 472 (gion `(* ,gmax ,@sptms))) … … 494 476 (e (car permqs)) 495 477 (gmax (car ((dis 'componentexports) sys (cid pore)))) 496 (pwrs (map (lambda (n) ( statepower sys n)) sts))478 (pwrs (map (lambda (n) (reactionpower sys n)) sts)) 497 479 (sptms (map (lambda (st pwr) `(pow ,st ,pwr)) sts pwrs)) 498 480 (gion `(* ,gmax ,@sptms))) … … 512 494 (let* ((i (matlabname (s+ 'i (cn acc)))) 513 495 (gmax (car ((dis 'componentexports) sys (cid pore)))) 514 (pwrs (map (lambda (n) ( statepower sys n)) sts))496 (pwrs (map (lambda (n) (reactionpower sys n)) sts)) 515 497 (sptms (map (lambda (st pwr) `(pow ,st ,pwr)) sts pwrs)) 516 498 (gion `(* ,gmax ,@sptms))) 
release/3/nemo/trunk/nemonmodl.scm
r12835 r12836 370 370 371 371 372 (define ( stateeqs n initial open transitions power method)372 (define (reactioneqs n initial open transitions power method) 373 373 (matchlet (((g nodesubs) (transitionsgraph n open transitions nmodlstatename))) 374 374 (let* ((outedges (g 'outedges)) … … 402 402 403 403 404 (define ( kstateeqs n initial open transitions power)404 (define (reactionkeqs n initial open transitions power) 405 405 (let* ((substconvert (substdriver (lambda (x) (and (symbol? x) x)) 406 406 nemo:binding? identity nemo:bind nemo:substterm)) … … 417 417 (loop (cons* s0 s1 lst) (cdr tlst))) 418 418 (else 419 (nemo:error 'nemo:nmodl kstateeqs ": invalid transition equation "419 (nemo:error 'nemo:nmodlreactionkeqs ": invalid transition equation " 420 420 (car tlst) " in state complex " n)) 421 421 (else (loop lst (cdr tlst))))))) … … 447 447 448 448 449 (else (nemo:error 'nemo:nmodl kstateeqs ": invalid transition equation "449 (else (nemo:error 'nemo:nmodlreactionkeqs ": invalid transition equation " 450 450 e " in state complex " n)))) 451 451 transitions)))) … … 467 467 (define (reactioneq n open transitions) 468 468 (list (nmodlname n) (nmodlname (nmodlstatename n open)))) 469 470 (define (poset>reactioneqdefs poset sys) 471 (foldright 472 (lambda (lst ax) 473 (fold (lambda (x ax) 474 (matchlet (((i . n) x)) 475 (let ((en (environmentref sys n))) 476 (if (and (not (member n kinetic)) (nemo:quantity? en)) 477 (cases nemo:quantity en 478 (REACTION (name initial open transitions conserve power) 479 (append (reactioneq name open transitions) ax)) 480 481 (else ax)) 482 ax)))) 483 ax lst)) 484 (list) poset)) 469 485 470 486 … … 492 508 (if (and (not (member n kinetic)) (nemo:quantity? en)) 493 509 (cases nemo:quantity en 494 (TSCOMP (name initial open transitions conserve power) 495 (append (stateeqs name initial open transitions power method) ax)) 510 (REACTION (name initial open transitions conserve power) 511 (append (reactioneqs name initial open transitions power method) ax)) 512 513 (RATE (name initial rhs) 514 (let ((fbody0 (rhsexpr rhs)) 515 (dy (s+ name "'"))) 516 (case method 517 ((expeuler) 518 (cons (list dy (canonicalizeexpr/NMODL (expeuler 'dt name fbody0))) 519 ax)) 520 (else 521 (cons (list dy (canonicalizeexpr/NMODL fbody0)) ax))))) 522 496 523 (else ax)) 497 524 ax)))) … … 508 535 (if (and (member n kinetic) (nemo:quantity? en)) 509 536 (cases nemo:quantity en 510 ( TSCOMP(name initial open transitions conserve power)511 (cons (kstateeqs name initial open transitions power) ax))537 (REACTION (name initial open transitions conserve power) 538 (cons (reactionkeqs name initial open transitions power) ax)) 512 539 (else ax)) 513 540 ax)))) … … 515 542 (list) poset)) 516 543 517 518 (define (poset>reactioneqdefs poset sys)519 (foldright520 (lambda (lst ax)521 (fold (lambda (x ax)522 (matchlet (((i . n) x))523 (let ((en (environmentref sys n)))524 (if (nemo:quantity? en)525 (cases nemo:quantity en526 (TSCOMP (name initial open transitions conserve power)527 (cons (reactioneq name open transitions) ax))528 (else ax))529 ax))))530 ax lst))531 (list) poset))532 544 533 545 (define (poset>stateinitdefs poset sys) … … 539 551 (if (nemo:quantity? en) 540 552 (cases nemo:quantity en 541 ( TSCOMP(name initial open transitions conserve power)542 543 (cons* (stateinit name initial)544 (stateinit (nmodlstatename name open) name) ax)545 ax))553 (REACTION (name initial open transitions conserve power) 554 (if (nemo:rhs? initial) 555 (cons* (stateinit name initial) 556 (stateinit (nmodlstatename name open) name) ax) 557 ax)) 546 558 (else ax)) 547 559 ax)))) … … 557 569 (if (nemo:quantity? en) 558 570 (cases nemo:quantity en 559 ( TSCOMP(name initial open transitions conserve power)560 561 (cons (statelineqs (nmodlname name) transitions conserve562 563 ax))571 (REACTION (name initial open transitions conserve power) 572 (if (and (list? conserve) (every nemo:lineq? conserve)) 573 (cons (statelineqs (nmodlname name) transitions conserve 574 nmodlstatename) ax) 575 ax)) 564 576 (else ax)) 565 577 ax)))) … … 572 584 573 585 574 (define ( statepower sys n)586 (define (reactionpower sys n) 575 587 (let ((en (environmentref sys n))) 576 588 (if (nemo:quantity? en) 577 589 (cases nemo:quantity en 578 ( TSCOMP(name initial open transitions conserve power) power)590 (REACTION (name initial open transitions conserve power) power) 579 591 (else #f)) #f))) 580 592 … … 593 605 (define (collectepools sys) 594 606 (matchlet ((($ nemo:quantity 'DISPATCH dis) (environmentref sys (nemointern 'dispatch)))) 595 (let recur ((compname (nemointern 'toplevel)) (ax (list))) 596 (let* ((compsymbols ((dis 'componentsymbols) sys compname)) 597 (subcomps ((dis 'componentsubcomps) sys compname))) 598 (fold recur 599 (fold (lambda (sym ax) 600 (let ((en (environmentref sys sym))) 601 (match en 602 ((or (('decaying 'pool) ('name (? symbol? ion)) . alst) 603 (('decayingpool) ('name (? symbol? ion)) . alst)) 604 (cons (list ion alst) ax)) 605 (else ax)))) ax compsymbols) 606 (map third subcomps)))))) 607 (let recur ((compname (nemointern 'toplevel)) (ax (list))) 608 (let* ((compsymbols ((dis 'componentsymbols) sys compname)) 609 (subcomps ((dis 'componentsubcomps) sys compname)) 610 (iscomp? (lambda (x) (match x (('decayingpool name id) id) 611 (('decaying 'pool name id) id) 612 (else #f))))) 613 (letvalues (((epoolcomps othercomps) (partition iscomp? subcomps))) 614 (let ((epools (map (lambda (x) 615 (let ((exports ((dis 'componentexports) sys (cid x)))) 616 (if (null? exports) 617 (nemo:error 'nemo:nmodltranslator 618 ": ion pool component " (cid x) 619 " must export a state")) 620 `(,@(cdr x) ,(car exports)))) 621 epoolscomps))) 622 (fold recur othercomps (append epools ax)))))))) 607 623 608 624 … … 626 642 (kinetic (if (eq? kinetic 'all) (deleteduplicates (map first states)) kinetic)) 627 643 (reactions ((dis 'reactions) sys)) 644 (rates ((dis 'rates) sys)) 628 645 (defuns ((dis 'defuns) sys)) 629 646 (components ((dis 'components) sys)) … … 659 676 (list) ionchs)) 660 677 (poolions (map (lambda (ep) 661 (let ((ion (car ep))) 662 `(,(nmodlname ion) ,(nmodlname (s+ 'i ion)) ,(nmodlname (s+ ion 'i))))) 678 (let ((ion (first ep)) 679 (state (fourth ep))) 680 `(,(nmodlname state) ,(nmodlname (s+ 'i ion)) 681 ,(nmodlname (s+ ion 'i))))) 663 682 epools)) 664 683 (igates (fold (lambda (ionch ax) 665 (let* ((subcomps ((dis 'componentsubcomps) sys (cid ionch)))666 (igatecomp 684 (let* ((subcomps ((dis 'componentsubcomps) sys (cid ionch))) 685 (igatecomp (lookupdef 'binarygate subcomps))) 667 686 (if igatecomp 668 687 (let* ((igateexps ((dis 'componentexports) sys (cid igatecomp))) … … 752 771 (let ((n (first def)) (b (second def))) 753 772 (pp indent+ ,(expr>string/NMODL b n)))) constdefs) 754 (foreach (lambda (ep) 755 (let* ((epname (first ep)) 756 (epprops (second ep)) 757 (initexpr (lookupdef 'initial epprops)) 758 (tempexpr (lookupdef 'tempadj epprops)) 759 (betaexpr (lookupdef 'beta epprops)) 760 (depthexpr (lookupdef 'depth epprops)) 761 (initname (nmodlname (s+ epname 'init))) 762 (tempname (nmodlname (s+ epname 'tempadj))) 763 (betaname (nmodlname (s+ epname 'beta))) 764 (depthname (nmodlname (s+ epname 'depth)))) 765 (if (or (not betaexpr) (not depthexpr) (not initexpr)) 766 (nemo:error 'nemo:nmodltranslator 767 ": ion pool " epname " requires initial value, depth and beta parameters")) 768 (let ((tempval (and tempexpr (evalconst sys tempexpr))) 769 (initval (evalconst sys initexpr)) 770 (betaval (evalconst sys betaexpr)) 771 (depthval (evalconst sys depthexpr))) 772 (pp indent+ ,(expr>string/NMODL initval initname)) 773 (pp indent+ ,(expr>string/NMODL tempval tempname)) 774 (pp indent+ ,(expr>string/NMODL betaval betaname)) 775 (pp indent+ ,(expr>string/NMODL depthval depthname))))) 776 epools)) 777 (case method ((expeuler) (pp indent+ dt))) 778 (pp indent "}") 773 774 (case method ((expeuler) (pp indent+ dt))) 775 (pp indent "}")) 779 776 780 777 (let* ((definefn (makedefinefn table? minv maxv tablewith depend))) … … 793 790 (foreach (lambda (st) (apply definestate (list indent+ st))) 794 791 reactions) 792 (foreach (lambda (st) (apply definestate (list indent+ st))) 793 rates) 795 794 (foreach (lambda (poolion) (apply definestate (list indent+ (first poolion)))) 796 795 poolions) … … 809 808 (if (not (null? asgns)) 810 809 (begin 811 (pp indent ,nl (PROCEDURE rates () "{"))810 (pp indent ,nl (PROCEDURE asgns () "{")) 812 811 (let ((locals (findlocals (map second asgneqdefs))) ) 813 812 (if (not (null? locals)) (pp indent+ (LOCAL ,(sl\ ", " locals))))) … … 830 829 (begin 831 830 (pp indent ,nl (PROCEDURE reactions () "{")) 832 (let* ((eqdefs (poset>reaction seqdefs poset sys))831 (let* ((eqdefs (poset>reactioneqdefs poset sys)) 833 832 (locals (findlocals (map second eqdefs))) ) 834 833 (if (not (null? locals)) (pp indent+ (LOCAL ,(sl\ ", " locals)))) … … 871 870 (e (car permqs)) 872 871 (gmax (car ((dis 'componentexports) sys (cid pore)))) 873 (pwrs (map (lambda (n) ( statepower sys n)) sts))872 (pwrs (map (lambda (n) (reactionpower sys n)) sts)) 874 873 (sptms (map (lambda (st pwr) `(pow ,st ,pwr)) sts pwrs)) 875 874 (gion `(* ,gmax ,@sptms))) … … 879 878 (e (nmodlname (s+ 'e (cn perm)))) 880 879 (gmax (car ((dis 'componentexports) sys (cid pore)))) 881 (pwrs (map (lambda (n) ( statepower sys n)) sts))880 (pwrs (map (lambda (n) (reactionpower sys n)) sts)) 882 881 (sptms (map (lambda (st pwr) `(pow ,st ,pwr)) sts pwrs)) 883 882 (gion `(* ,gmax ,@sptms))) … … 900 899 (let* ((i (nmodlname (s+ 'i (cn acc)))) 901 900 (gmax (car ((dis 'componentexports) sys (cid pore)))) 902 (pwrs (map (lambda (n) ( statepower sys n)) sts))901 (pwrs (map (lambda (n) (reactionpower sys n)) sts)) 903 902 (sptms (map (lambda (st pwr) `(pow ,st ,pwr)) sts pwrs)) 904 903 (gion `(* ,gmax ,@sptms))) … … 935 934 (locals (findlocals (map second ieqs)))) 936 935 (if (not (null? locals)) (pp indent+ (LOCAL ,(sl\ ", " locals)))) 937 (if (not (null? asgns)) (pp indent+ ( rates ())))936 (if (not (null? asgns)) (pp indent+ (asgns ()))) 938 937 (if hasode? 939 938 (case method … … 947 946 948 947 (if hasode? 949 (let* ((stateeqdefs (reverse (poset>stateeqdefs poset sys kinetic method))) 950 (pooleqdefs 951 (map (lambda (ep) 952 (let* ((epname (first ep)) 953 (poolion (assoc epname poolions)) 954 (iname (second poolion)) 955 (initname (nmodlname (s+ epname 'init))) 956 (tempname (nmodlname (s+ epname 'tempadj))) 957 (betaname (nmodlname (s+ epname 'beta))) 958 (depthname (nmodlname (s+ epname 'depth))) 959 (rhs `(let ((F 96485.0)) 960 ( (/ (neg ,iname) (* 2 F ,initname ,depthname)) 961 (* ,epname ,betaname . 962 ,(if tempname (list tempname) (list))))))) 963 (case method 964 ((expeuler) `(,epname ,(canonicalizeexpr/NMODL (expeuler 'dt epname rhs)))) 965 (else `(,(s+ epname "'") ,(canonicalizeexpr/NMODL rhs)))))) 966 epools)) 967 (eqdefs (append pooleqdefs stateeqdefs)) 968 (locals (findlocals (map second eqdefs)))) 948 (let* ((eqdefs (reverse (poset>stateeqdefs poset sys kinetic method))) 949 (locals (findlocals (map second eqdefs)))) 969 950 (case method 970 951 ((expeuler) (pp indent ,nl (PROCEDURE states () "{"))) … … 1016 997 (pp indent ,nl (INITIAL "{")) 1017 998 (if (not (null? locals)) (pp indent+ (LOCAL ,(sl\ ", " locals)))) 1018 (if (not (null? asgns)) (pp indent+ ( rates ())))999 (if (not (null? asgns)) (pp indent+ (asgns ()))) 1019 1000 (foreach (lambda (def) 1020 1001 (let ((n (first def)) (b (second def)))
Note: See TracChangeset
for help on using the changeset viewer.