Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Brought RC into sync with trunk. Updated READMEs to match work on - blowfish - dns - httpd - markdown - profiler - struct::matrix - tcl::chan::halfpipe |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | release | tcllib-1-20 | tcllib-1-20-rc |
Files: | files | file ages | folders |
SHA3-256: |
a198fe68f53d1edc9c682e86ea93345f |
User & Date: | aku 2019-11-26 04:25:45.672 |
Context
2019-12-01
| ||
21:55 | Tcllib Release 1.20 work integrated with trunk. Release imminent. check-in: 678001e94f user: aku tags: trunk | |
2019-11-26
| ||
04:25 | Brought RC into sync with trunk. Updated READMEs to match work on - blowfish - dns - httpd - markdown - profiler - struct::matrix - tcl::chan::halfpipe Closed-Leaf check-in: a198fe68f5 user: aku tags: release, tcllib-1-20, tcllib-1-20-rc | |
02:53 | Integrated blowfish work. Updated local documentation. check-in: c230d5a347 user: aku tags: trunk | |
2019-11-15
| ||
23:11 | Brought RC into sync with trunk. Updated READMEs to match new math work. check-in: 5be0d16961 user: aku tags: tcllib-1-20-rc | |
Changes
Changes to embedded/md/tcllib/files/modules/blowfish/blowfish.md.
1 2 3 4 | [//000000001]: # (blowfish \- Blowfish Block Cipher) [//000000002]: # (Generated from file 'blowfish\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2003, Pat Thoyts <patthoyts@users\.sourceforge\.net>) | | | 1 2 3 4 5 6 7 8 9 10 11 12 | [//000000001]: # (blowfish \- Blowfish Block Cipher) [//000000002]: # (Generated from file 'blowfish\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2003, Pat Thoyts <patthoyts@users\.sourceforge\.net>) [//000000004]: # (blowfish\(n\) 1\.0\.5 tcllib "Blowfish Block Cipher") <hr> [ <a href="../../../../toc.md">Main Table Of Contents</a> | <a href="../../../toc.md">Table Of Contents</a> | <a href="../../../../index.md">Keyword Index</a> | <a href="../../../../toc0.md">Categories</a> | <a href="../../../../toc1.md">Modules</a> | <a href="../../../../toc2.md">Applications</a> ] <hr> |
︙ | ︙ | |||
44 45 46 47 48 49 50 | - [Category](#category) - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.4 | | | 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | - [Category](#category) - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.4 package require blowfish ?1\.0\.5? [__::blowfish::blowfish__ ?*\-mode \[ecb|cbc\]*? ?*\-dir \[encrypt|decrypt\]*? *\-key keydata* ?*\-iv vector*? ?*\-out channel*? ?*\-chunksize size*? ?*\-pad padchar*? \[ *\-in channel* | ?*\-\-*? *data* \]](#1) [__::blowfish::Init__ *mode* *keydata* *iv*](#2) [__::blowfish::Encrypt__ *Key* *data*](#3) [__::blowfish::Decrypt__ *Key* *data*](#4) [__::blowfish::Reset__ *Key* *iv*](#5) [__::blowfish::Final__ *Key*](#6) |
︙ | ︙ |
Changes to embedded/md/tcllib/files/modules/clay/clay.md.
1 2 3 4 | [//000000001]: # (clay \- Clay Framework) [//000000002]: # (Generated from file 'clay\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2018 Sean Woods <yoda@etoyoc\.com>) | | | 1 2 3 4 5 6 7 8 9 10 11 12 | [//000000001]: # (clay \- Clay Framework) [//000000002]: # (Generated from file 'clay\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2018 Sean Woods <yoda@etoyoc\.com>) [//000000004]: # (clay\(n\) 0\.8\.6 tcllib "Clay Framework") <hr> [ <a href="../../../../toc.md">Main Table Of Contents</a> | <a href="../../../toc.md">Table Of Contents</a> | <a href="../../../../index.md">Keyword Index</a> | <a href="../../../../toc0.md">Categories</a> | <a href="../../../../toc1.md">Modules</a> | <a href="../../../../toc2.md">Applications</a> ] <hr> |
︙ | ︙ | |||
61 62 63 64 65 66 67 | [proc __clay::dynamic\_arguments__ *ensemble* *method* *arglist* ?*args*?](#6) [proc __clay::dynamic\_wrongargs\_message__ *arglist*](#7) [proc __clay::is\_dict__ *d*](#8) [proc __clay::is\_null__ *value*](#9) [proc __clay::leaf__ ?*args*?](#10) [proc __clay::K__ *a* *b*](#11) [proc __clay::noop__ ?*args*?](#12) | > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < < < > | | | | | | | | | | > | | | | | | | | | | | | | | | | > | | | | 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | [proc __clay::dynamic\_arguments__ *ensemble* *method* *arglist* ?*args*?](#6) [proc __clay::dynamic\_wrongargs\_message__ *arglist*](#7) [proc __clay::is\_dict__ *d*](#8) [proc __clay::is\_null__ *value*](#9) [proc __clay::leaf__ ?*args*?](#10) [proc __clay::K__ *a* *b*](#11) [proc __clay::noop__ ?*args*?](#12) [proc __clay::cleanup__](#13) [proc __clay::object\_create__ *objname* ?*class* ____?](#14) [proc __clay::object\_rename__ *object* *newname*](#15) [proc __clay::object\_destroy__ ?*args*?](#16) [proc __clay::path__ ?*args*?](#17) [proc __clay::putb__ ?*map*? *text*](#18) [proc __clay::script\_path__](#19) [proc __clay::NSNormalize__ *qualname*](#20) [proc __clay::uuid\_generate__ ?*args*?](#21) [proc __clay::uuid::generate\_tcl\_machinfo__](#22) [proc __clay::uuid::tostring__ *uuid*](#23) [proc __clay::uuid::fromstring__ *uuid*](#24) [proc __clay::uuid::equal__ *left* *right*](#25) [proc __clay::uuid__ *cmd* ?*args*?](#26) [proc __clay::tree::sanitize__ *dict*](#27) [proc __clay::tree::\_sanitizeb__ *path* *varname* *dict*](#28) [proc __clay::tree::storage__ *rawpath*](#29) [proc __clay::tree::dictset__ *varname* ?*args*?](#30) [proc __clay::tree::dictmerge__ *varname* ?*args*?](#31) [proc __clay::tree::merge__ ?*args*?](#32) [proc __dictargs::proc__ *name* *argspec* *body*](#33) [proc __dictargs::method__ *name* *argspec* *body*](#34) [proc __clay::dialect::Push__ *class*](#35) [proc __clay::dialect::Peek__](#36) [proc __clay::dialect::Pop__](#37) [proc __clay::dialect::create__ *name* ?*parent* ____?](#38) [proc __clay::dialect::NSNormalize__ *namespace* *qualname*](#39) [proc __clay::dialect::DefineThunk__ *target* ?*args*?](#40) [proc __clay::dialect::Canonical__ *namespace* *NSpace* *class*](#41) [proc __clay::dialect::Define__ *namespace* *class* ?*args*?](#42) [proc __clay::dialect::Aliases__ *namespace* ?*args*?](#43) [proc __clay::dialect::SuperClass__ *namespace* ?*args*?](#44) [proc __clay::dynamic\_methods__ *class*](#45) [proc __clay::dynamic\_methods\_class__ *thisclass*](#46) [proc __clay::define::Array__ *name* ?*values* ____?](#47) [proc __clay::define::Delegate__ *name* *info*](#48) [proc __clay::define::constructor__ *arglist* *rawbody*](#49) [proc __clay::define::Class\_Method__ *name* *arglist* *body*](#50) [proc __clay::define::class\_method__ *name* *arglist* *body*](#51) [proc __clay::define::clay__ ?*args*?](#52) [proc __clay::define::destructor__ *rawbody*](#53) [proc __clay::define::Dict__ *name* ?*values* ____?](#54) [proc __clay::define::Option__ *name* ?*args*?](#55) [proc __clay::define::Method__ *name* *argstyle* *argspec* *body*](#56) [proc __clay::define::Option\_Class__ *name* ?*args*?](#57) [proc __clay::define::Variable__ *name* ?*default* ____?](#58) [proc __clay::ensemble\_methodbody__ *ensemble* *einfo*](#59) [proc __clay::define::Ensemble__ *rawmethod* ?*args*?](#60) [proc __clay::event::cancel__ *self* ?*task* __\*__?](#61) [proc __clay::event::generate__ *self* *event* ?*args*?](#62) [proc __clay::event::nextid__](#63) [proc __clay::event::Notification\_list__ *self* *event* ?*stackvar* ____?](#64) [proc __clay::event::notify__ *rcpt* *sender* *event* *eventinfo*](#65) [proc __clay::event::process__ *self* *handle* *script*](#66) [proc __clay::event::schedule__ *self* *handle* *interval* *script*](#67) [proc __clay::event::subscribe__ *self* *who* *event*](#68) [proc __clay::event::unsubscribe__ *self* ?*args*?](#69) [proc __clay::singleton__ *name* *script*](#70) [method __clay ancestors__](#71) [method __clay dump__](#72) [method __clay find__ *path* ?__path\.\.\.__?](#73) [method __clay get__ *path* ?__path\.\.\.__?](#74) [method __clay GET__ *path* ?__path\.\.\.__?](#75) [method __clay merge__ *dict* ?__dict\.\.\.__?](#76) [method __clay replace__ *dictionary*](#77) [method __clay search__ *path* ?__path\.\.\.__?](#78) [method __clay set__ *path* ?__path\.\.\.__? *value*](#79) [method __clay ancestors__](#80) [method __clay cache__ *path* *value*](#81) [method __clay cget__ *field*](#82) [method __clay delegate__ ?*stub*? ?*object*?](#83) [method __clay dump__](#84) [method __clay ensemble\_map__](#85) [method __clay eval__ *script*](#86) [method __clay evolve__](#87) [method __clay exists__ *path* ?__path\.\.\.__?](#88) [method __clay flush__](#89) [method __clay forward__ *method* *object*](#90) [method __clay get__ *path* ?__path\.\.\.__?](#91) [method __clay leaf__ *path* ?__path\.\.\.__?](#92) [method __clay merge__ *dict* ?__dict\.\.\.__?](#93) [method __clay mixin__ *class* ?__class\.\.\.__?](#94) [method __clay mixinmap__ ?*stub*? ?*classes*?](#95) [method __clay provenance__ *path* ?__path\.\.\.__?](#96) [method __clay replace__ *dictionary*](#97) [method __clay search__ *path* *valuevar* *isleafvar*](#98) [method __clay source__ *filename*](#99) [method __clay set__ *path* ?__path\.\.\.__? *value*](#100) [method __InitializePublic__](#101) # <a name='description'></a>DESCRIPTION Clay introduces a method ensemble to both __oo::class__ and __oo::object__ called clay\. This ensemble handles all of the high level interactions within the framework\. Clay stores structured data\. Clan manages method delegation\. Clay has facilities to manage the complex interactions that |
︙ | ︙ | |||
308 309 310 311 312 313 314 | - <a name='12'></a>proc __clay::noop__ ?*args*? Perform a noop\. Useful in prototyping for commenting out blocks of code without actually having to comment them out\. It also makes a handy default for method delegation if a delegate has not been assigned yet\. | | > > | > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > > | < | < < | 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 | - <a name='12'></a>proc __clay::noop__ ?*args*? Perform a noop\. Useful in prototyping for commenting out blocks of code without actually having to comment them out\. It also makes a handy default for method delegation if a delegate has not been assigned yet\. - <a name='13'></a>proc __clay::cleanup__ Process the queue of objects to be destroyed - <a name='14'></a>proc __clay::object\_create__ *objname* ?*class* ____? - <a name='15'></a>proc __clay::object\_rename__ *object* *newname* - <a name='16'></a>proc __clay::object\_destroy__ ?*args*? Mark an objects for destruction on the next cleanup - <a name='17'></a>proc __clay::path__ ?*args*? - <a name='18'></a>proc __clay::putb__ ?*map*? *text* Append a line of text to a variable\. Optionally apply a string mapping\. - <a name='19'></a>proc __clay::script\_path__ - <a name='20'></a>proc __clay::NSNormalize__ *qualname* - <a name='21'></a>proc __clay::uuid\_generate__ ?*args*? - <a name='22'></a>proc __clay::uuid::generate\_tcl\_machinfo__ - <a name='23'></a>proc __clay::uuid::tostring__ *uuid* - <a name='24'></a>proc __clay::uuid::fromstring__ *uuid* Convert a string representation of a uuid into its binary format\. - <a name='25'></a>proc __clay::uuid::equal__ *left* *right* Compare two uuids for equality\. - <a name='26'></a>proc __clay::uuid__ *cmd* ?*args*? uuid generate \-> string rep of a new uuid uuid equal uuid1 uuid2 - <a name='27'></a>proc __clay::tree::sanitize__ *dict* Output a dictionary removing any \. entries added by __clay::tree::merge__ - <a name='28'></a>proc __clay::tree::\_sanitizeb__ *path* *varname* *dict* Helper function for ::clay::tree::sanitize Formats the string representation for a dictionary element within a human readable stream of lines, and determines if it needs to call itself with further indentation to express a sub\-branch - <a name='29'></a>proc __clay::tree::storage__ *rawpath* Return the path as a storage path for clay::tree with all branch terminators removed\. This command will also break arguments up if they contain /\. Example: > clay::tree::storage {foo bar baz bang} foo bar baz bang > clay::tree::storage {foo bar baz bang/} foo bar baz bang > clay::tree::storage {foo bar baz bang:} foo bar baz bang: > clay::tree::storage {foo/bar/baz bang:} foo bar baz bang: > clay::tree::storage {foo/bar/baz/bang} foo bar baz bang - <a name='30'></a>proc __clay::tree::dictset__ *varname* ?*args*? Set an element with a recursive dictionary, marking all branches on the way down to the final element\. If the value does not exists in the nested dictionary it is added as a leaf\. If the value already exists as a branch the value given is merged if the value is a valid dict\. If the incoming value is not a valid dict, the value overrides the value stored, and the value is treated as a leaf from then on\. Example: > set r {} > ::clay::tree::dictset r option color default Green . {} option {. {} color {. {} default Green}} > ::clay::tree::dictset r option {Something not dictlike} . {} option {Something not dictlike} # Note that if the value is not a dict, and you try to force it to be # an error with be thrown on the merge > ::clay::tree::dictset r option color default Blue missing value to go with key - <a name='31'></a>proc __clay::tree::dictmerge__ *varname* ?*args*? A recursive form of dict merge, intended for modifying variables in place\. Example: > set mydict {sub/ {sub/ {description {a block of text}}}} > ::clay::tree::dictmerge mydict {sub/ {sub/ {field {another block of text}}}}] > clay::tree::print $mydict sub/ { sub/ { description {a block of text} field {another block of text} } } - <a name='32'></a>proc __clay::tree::merge__ ?*args*? A recursive form of dict merge A routine to recursively dig through dicts and merge adapted from http://stevehavelka\.com/tcl\-dict\-operation\-nested\-merge/ Example: > set mydict {sub/ {sub/ {description {a block of text}}}} > set odict [clay::tree::merge $mydict {sub/ {sub/ {field {another block of text}}}}] > clay::tree::print $odict sub/ { sub/ { description {a block of text} field {another block of text} } } - <a name='33'></a>proc __dictargs::proc__ *name* *argspec* *body* Named Procedures as new command - <a name='34'></a>proc __dictargs::method__ *name* *argspec* *body* - <a name='35'></a>proc __clay::dialect::Push__ *class* - <a name='36'></a>proc __clay::dialect::Peek__ - <a name='37'></a>proc __clay::dialect::Pop__ - <a name='38'></a>proc __clay::dialect::create__ *name* ?*parent* ____? This proc will generate a namespace, a "mother of all classes", and a rudimentary set of policies for this dialect\. - <a name='39'></a>proc __clay::dialect::NSNormalize__ *namespace* *qualname* Support commands; not intended to be called directly\. - <a name='40'></a>proc __clay::dialect::DefineThunk__ *target* ?*args*? - <a name='41'></a>proc __clay::dialect::Canonical__ *namespace* *NSpace* *class* - <a name='42'></a>proc __clay::dialect::Define__ *namespace* *class* ?*args*? Implementation of the languages' define command - <a name='43'></a>proc __clay::dialect::Aliases__ *namespace* ?*args*? - <a name='44'></a>proc __clay::dialect::SuperClass__ *namespace* ?*args*? - <a name='45'></a>proc __clay::dynamic\_methods__ *class* - <a name='46'></a>proc __clay::dynamic\_methods\_class__ *thisclass* - <a name='47'></a>proc __clay::define::Array__ *name* ?*values* ____? New OO Keywords for clay - <a name='48'></a>proc __clay::define::Delegate__ *name* *info* An annotation that objects of this class interact with delegated methods\. The annotation is intended to be a dictionary, and the only reserved key is *description*, a human readable description\. - <a name='49'></a>proc __clay::define::constructor__ *arglist* *rawbody* - <a name='50'></a>proc __clay::define::Class\_Method__ *name* *arglist* *body* Specify the a method for the class object itself, instead of for objects of the class - <a name='51'></a>proc __clay::define::class\_method__ *name* *arglist* *body* And alias to the new Class\_Method keyword - <a name='52'></a>proc __clay::define::clay__ ?*args*? - <a name='53'></a>proc __clay::define::destructor__ *rawbody* - <a name='54'></a>proc __clay::define::Dict__ *name* ?*values* ____? - <a name='55'></a>proc __clay::define::Option__ *name* ?*args*? Define an option for the class - <a name='56'></a>proc __clay::define::Method__ *name* *argstyle* *argspec* *body* - <a name='57'></a>proc __clay::define::Option\_Class__ *name* ?*args*? Define a class of options All field / value pairs will be be inherited by an option that specify *name* as it class field\. - <a name='58'></a>proc __clay::define::Variable__ *name* ?*default* ____? This keyword can also be expressed: property variable NAME {default DEFAULT} Variables registered in the variable property are also initialized \(if missing\) when the object changes class via the *morph* method\. - <a name='59'></a>proc __clay::ensemble\_methodbody__ *ensemble* *einfo* Produce the body of an ensemble's public dispatch method ensemble is the name of the the ensemble\. einfo is a dictionary of methods for the ensemble, and each value is a script to execute on dispatch Example: ::clay::ensemble_methodbody foo { bar {tailcall my Foo_bar {*}$args} baz {tailcall my Foo_baz {*}$args} clock {return [clock seconds]} default {puts "You gave me $method"} } - <a name='60'></a>proc __clay::define::Ensemble__ *rawmethod* ?*args*? - <a name='61'></a>proc __clay::event::cancel__ *self* ?*task* __\*__? Cancel a scheduled event - <a name='62'></a>proc __clay::event::generate__ *self* *event* ?*args*? |
︙ | ︙ | |||
557 558 559 560 561 562 563 564 565 566 567 568 569 | Subscribe an object to an event pattern - <a name='69'></a>proc __clay::event::unsubscribe__ *self* ?*args*? Unsubscribe an object from an event pattern # <a name='section3'></a>Classes ## <a name='subsection4'></a>Class clay::class __Methods__ | > > > > | | | | | | | | | | > > > > > | | | | | | | | | | | | | | | | > > > > > | | | | 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 | Subscribe an object to an event pattern - <a name='69'></a>proc __clay::event::unsubscribe__ *self* ?*args*? Unsubscribe an object from an event pattern - <a name='70'></a>proc __clay::singleton__ *name* *script* An object which is intended to be it's own class\. # <a name='section3'></a>Classes ## <a name='subsection4'></a>Class clay::class __Methods__ - <a name='71'></a>method __clay ancestors__ Return this class and all ancestors in search order\. - <a name='72'></a>method __clay dump__ Return a complete dump of this object's clay data, but only this object's clay data\. - <a name='73'></a>method __clay find__ *path* ?__path\.\.\.__? Pull a chunk of data from the clay system\. If the last element of *path* is a branch, returns a recursive merge of all data from this object and it's constituent classes of the data in that branch\. If the last element is a leaf, search this object for a matching leaf, or search all constituent classes for a matching leaf and return the first value found\. If no value is found, returns an empty string\. If a branch is returned the topmost \. entry is omitted\. - <a name='74'></a>method __clay get__ *path* ?__path\.\.\.__? Pull a chunk of data from the class's clay system\. If no value is found, returns an empty string\. If a branch is returned the topmost \. entry is omitted\. - <a name='75'></a>method __clay GET__ *path* ?__path\.\.\.__? Pull a chunk of data from the class's clay system\. If no value is found, returns an empty string\. - <a name='76'></a>method __clay merge__ *dict* ?__dict\.\.\.__? Recursively merge the dictionaries given into the object's local clay storage\. - <a name='77'></a>method __clay replace__ *dictionary* Replace the contents of the internal clay storage with the dictionary given\. - <a name='78'></a>method __clay search__ *path* ?__path\.\.\.__? Return the first matching value for the path in either this class's clay data or one of its ancestors - <a name='79'></a>method __clay set__ *path* ?__path\.\.\.__? *value* Merge the conents of __value__ with the object's clay storage at __path__\. ## <a name='subsection5'></a>Class clay::object clay::object This class is inherited by all classes that have options\. __Methods__ - <a name='80'></a>method __clay ancestors__ Return the class this object belongs to, all classes mixed into this object, and all ancestors of those classes in search order\. - <a name='81'></a>method __clay cache__ *path* *value* Store VALUE in such a way that request in SEARCH for PATH will always return it until the cache is flushed - <a name='82'></a>method __clay cget__ *field* Pull a value from either the object's clay structure or one of its constituent classes that matches the field name\. The order of search us: 1\. The as a value in local dict variable config 2\. The as a value in local dict variable clay 3\. As a leaf in any ancestor as a root of the clay tree 4\. As a leaf in any ancestor as __const__ *field* 5\. As a leaf in any ancestor as __option__ *field* __default__ - <a name='83'></a>method __clay delegate__ ?*stub*? ?*object*? Introspect or control method delegation\. With no arguments, the method will return a key/value list of stubs and objects\. With just the *stub* argument, the method will return the object \(if any\) attached to the stub\. With a *stub* and an *object* this command will forward all calls to the method *stub* to the *object*\. - <a name='84'></a>method __clay dump__ Return a complete dump of this object's clay data, as well as the data from all constituent classes recursively blended in\. - <a name='85'></a>method __clay ensemble\_map__ Return a dictionary describing the method ensembles to be assembled for this object - <a name='86'></a>method __clay eval__ *script* Evaluated a script in the namespace of this object - <a name='87'></a>method __clay evolve__ Trigger the __InitializePublic__ private method - <a name='88'></a>method __clay exists__ *path* ?__path\.\.\.__? Returns 1 if *path* exists in either the object's clay data\. Values greater than one indicate the element exists in one of the object's constituent classes\. A value of zero indicates the path could not be found\. - <a name='89'></a>method __clay flush__ Wipe any caches built by the clay implementation - <a name='90'></a>method __clay forward__ *method* *object* A convenience wrapper for oo::objdefine [self] forward {*}$args - <a name='91'></a>method __clay get__ *path* ?__path\.\.\.__? Pull a chunk of data from the clay system\. If the last element of *path* is a branch \(ends in a slash /\), returns a recursive merge of all data from this object and it's constituent classes of the data in that branch\. If the last element is a leaf, search this object for a matching leaf, or search all constituent classes for a matching leaf and return the first value found\. If no value is found, returns an empty string\. - <a name='92'></a>method __clay leaf__ *path* ?__path\.\.\.__? A modified get which is tailored to pull only leaf elements - <a name='93'></a>method __clay merge__ *dict* ?__dict\.\.\.__? Recursively merge the dictionaries given into the object's local clay storage\. - <a name='94'></a>method __clay mixin__ *class* ?__class\.\.\.__? Perform \[oo::objdefine \[self\] mixin\] on this object, with a few additional rules: Prior to the call, for any class was previously mixed in, but not in the new result, execute the script registered to mixin/ unmap\-script \(if given\.\) For all new classes, that were not present prior to this call, after the native TclOO mixin is invoked, execute the script registered to mixin/ map\-script \(if given\.\) Fall all classes that are now present and “mixed in”, execute the script registered to mixin/ react\-script \(if given\.\) - <a name='95'></a>method __clay mixinmap__ ?*stub*? ?*classes*? With no arguments returns the map of stubs and classes mixed into the current object\. When only stub is given, returns the classes mixed in on that stub\. When stub and classlist given, replace the classes currently on that stub with the given classes and invoke clay mixin on the new matrix of mixed in classes\. - <a name='96'></a>method __clay provenance__ *path* ?__path\.\.\.__? Return either __self__ if that path exists in the current object, or return the first class \(if any\) along the clay search path which contains that element\. - <a name='97'></a>method __clay replace__ *dictionary* Replace the contents of the internal clay storage with the dictionary given\. - <a name='98'></a>method __clay search__ *path* *valuevar* *isleafvar* Return true, and set valuevar to the value and isleafar to true for false if PATH was found in the cache\. - <a name='99'></a>method __clay source__ *filename* Source the given filename within the object's namespace - <a name='100'></a>method __clay set__ *path* ?__path\.\.\.__? *value* Merge the conents of __value__ with the object's clay storage at __path__\. - <a name='101'></a>method __InitializePublic__ Instantiate variables\. Called on object creation and during clay mixin\. # <a name='section4'></a>AUTHORS Sean Woods |
︙ | ︙ |
Changes to embedded/md/tcllib/files/modules/debug/debug_heartbeat.md.
1 2 3 4 5 | [//000000001]: # (debug::heartbeat \- debug narrative) [//000000002]: # (Generated from file 'debug\_heartbeat\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 200?, Colin McCormack, Wub Server Utilities) [//000000004]: # (Copyright © 2012, Andreas Kupries <andreas\_kupries@users\.sourceforge\.net>) | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | [//000000001]: # (debug::heartbeat \- debug narrative) [//000000002]: # (Generated from file 'debug\_heartbeat\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 200?, Colin McCormack, Wub Server Utilities) [//000000004]: # (Copyright © 2012, Andreas Kupries <andreas\_kupries@users\.sourceforge\.net>) [//000000005]: # (debug::heartbeat\(n\) 1\.0\.1 tcllib "debug narrative") <hr> [ <a href="../../../../toc.md">Main Table Of Contents</a> | <a href="../../../toc.md">Table Of Contents</a> | <a href="../../../../index.md">Keyword Index</a> | <a href="../../../../toc0.md">Categories</a> | <a href="../../../../toc1.md">Modules</a> | <a href="../../../../toc2.md">Applications</a> ] <hr> |
︙ | ︙ | |||
33 34 35 36 37 38 39 | - [Category](#category) - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.5 | | | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | - [Category](#category) - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.5 package require debug::heartbeat ?1\.0\.1? package require debug ?1? [__[debug](debug\.md)__ __heartbeat__ ?*delta*?](#1) # <a name='description'></a>DESCRIPTION # <a name='section2'></a>API |
︙ | ︙ |
Changes to embedded/md/tcllib/files/modules/dns/tcllib_dns.md.
1 2 3 4 | [//000000001]: # (dns \- Domain Name Service) [//000000002]: # (Generated from file 'tcllib\_dns\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2002, Pat Thoyts) | | | 1 2 3 4 5 6 7 8 9 10 11 12 | [//000000001]: # (dns \- Domain Name Service) [//000000002]: # (Generated from file 'tcllib\_dns\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2002, Pat Thoyts) [//000000004]: # (dns\(n\) 1\.4\.1 tcllib "Domain Name Service") <hr> [ <a href="../../../../toc.md">Main Table Of Contents</a> | <a href="../../../toc.md">Table Of Contents</a> | <a href="../../../../index.md">Keyword Index</a> | <a href="../../../../toc0.md">Categories</a> | <a href="../../../../toc1.md">Modules</a> | <a href="../../../../toc2.md">Applications</a> ] <hr> |
︙ | ︙ | |||
40 41 42 43 44 45 46 | - [Category](#category) - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.2 | | | 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | - [Category](#category) - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.2 package require dns ?1\.4\.1? [__::dns::resolve__ *query* ?*options*?](#1) [__::dns::configure__ ?*options*?](#2) [__::dns::name__ *token*](#3) [__::dns::address__ *token*](#4) [__::dns::cname__ *token*](#5) [__::dns::result__ *token*](#6) |
︙ | ︙ |
Changes to embedded/md/tcllib/files/modules/httpd/httpd.md.
1 2 3 4 | [//000000001]: # (httpd \- Tcl Web Server) [//000000002]: # (Generated from file 'httpd\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2018 Sean Woods <yoda@etoyoc\.com>) | | | 1 2 3 4 5 6 7 8 9 10 11 12 | [//000000001]: # (httpd \- Tcl Web Server) [//000000002]: # (Generated from file 'httpd\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2018 Sean Woods <yoda@etoyoc\.com>) [//000000004]: # (httpd\(n\) 4\.3\.4 tcllib "Tcl Web Server") <hr> [ <a href="../../../../toc.md">Main Table Of Contents</a> | <a href="../../../toc.md">Table Of Contents</a> | <a href="../../../../index.md">Keyword Index</a> | <a href="../../../../toc0.md">Categories</a> | <a href="../../../../toc1.md">Modules</a> | <a href="../../../../toc2.md">Applications</a> ] <hr> |
︙ | ︙ |
Changes to embedded/md/tcllib/files/modules/markdown/markdown.md.
1 2 3 | [//000000001]: # (markdown \- Markdown to HTML Converter) [//000000002]: # (Generated from file 'markdown\.man' by tcllib/doctools with format 'markdown') | | | 1 2 3 4 5 6 7 8 9 10 11 | [//000000001]: # (markdown \- Markdown to HTML Converter) [//000000002]: # (Generated from file 'markdown\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (markdown\(n\) 1\.1\.1 tcllib "Markdown to HTML Converter") <hr> [ <a href="../../../../toc.md">Main Table Of Contents</a> | <a href="../../../toc.md">Table Of Contents</a> | <a href="../../../../index.md">Keyword Index</a> | <a href="../../../../toc0.md">Categories</a> | <a href="../../../../toc1.md">Modules</a> | <a href="../../../../toc2.md">Applications</a> ] <hr> |
︙ | ︙ | |||
25 26 27 28 29 30 31 | - [Bugs, Ideas, Feedback](#section2) - [Category](#category) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.5 | | | 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | - [Bugs, Ideas, Feedback](#section2) - [Category](#category) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.5 package require Markdown 1\.1\.1 package require textutil ?0\.8? [__::Markdown::convert__ *markdown*](#1) [__::Markdown::register__ *langspec* *converter*](#2) [__::Markdown::get\_lang\_counter__](#3) [__::Markdown::reset\_lang\_counter__](#4) |
︙ | ︙ |
Changes to embedded/md/tcllib/files/modules/math/math_geometry.md.
︙ | ︙ | |||
53 54 55 56 57 58 59 | [__::math::geometry::h__ *length*](#8) [__::math::geometry::v__ *length*](#9) [__::math::geometry::between__ *point1* *point2* *s*](#10) [__::math::geometry::octant__ *point*](#11) [__::math::geometry::rect__ *nw* *se*](#12) [__::math::geometry::nwse__ *rect*](#13) [__::math::geometry::angle__ *line*](#14) | > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | [__::math::geometry::h__ *length*](#8) [__::math::geometry::v__ *length*](#9) [__::math::geometry::between__ *point1* *point2* *s*](#10) [__::math::geometry::octant__ *point*](#11) [__::math::geometry::rect__ *nw* *se*](#12) [__::math::geometry::nwse__ *rect*](#13) [__::math::geometry::angle__ *line*](#14) [__::math::geometry::angleBetween__ *vector1* *vector2*](#15) [__::math::geometry::inproduct__ *vector1* *vector2*](#16) [__::math::geometry::areaParallellogram__ *vector1* *vector2*](#17) [__::math::geometry::calculateDistanceToLine__ *P* *line*](#18) [__::math::geometry::calculateDistanceToLineSegment__ *P* *linesegment*](#19) [__::math::geometry::calculateDistanceToPolyline__ *P* *polyline*](#20) [__::math::geometry::calculateDistanceToPolygon__ *P* *polygon*](#21) [__::math::geometry::findClosestPointOnLine__ *P* *line*](#22) [__::math::geometry::findClosestPointOnLineSegment__ *P* *linesegment*](#23) [__::math::geometry::findClosestPointOnPolyline__ *P* *polyline*](#24) [__::math::geometry::lengthOfPolyline__ *polyline*](#25) [__::math::geometry::movePointInDirection__ *P* *direction* *dist*](#26) [__::math::geometry::lineSegmentsIntersect__ *linesegment1* *linesegment2*](#27) [__::math::geometry::findLineSegmentIntersection__ *linesegment1* *linesegment2*](#28) [__::math::geometry::findLineIntersection__ *line1* *line2*](#29) [__::math::geometry::polylinesIntersect__ *polyline1* *polyline2*](#30) [__::math::geometry::polylinesBoundingIntersect__ *polyline1* *polyline2* *granularity*](#31) [__::math::geometry::intervalsOverlap__ *y1* *y2* *y3* *y4* *strict*](#32) [__::math::geometry::rectanglesOverlap__ *P1* *P2* *Q1* *Q2* *strict*](#33) [__::math::geometry::bbox__ *polyline*](#34) [__::math::geometry::pointInsidePolygon__ *P* *polyline*](#35) [__::math::geometry::pointInsidePolygonAlt__ *P* *polyline*](#36) [__::math::geometry::rectangleInsidePolygon__ *P1* *P2* *polyline*](#37) [__::math::geometry::areaPolygon__ *polygon*](#38) [__::math::geometry::translate__ *vector* *polyline*](#39) [__::math::geometry::rotate__ *angle* *polyline*](#40) [__::math::geometry::reflect__ *angle* *polyline*](#41) [__::math::geometry::degToRad__ *angle*](#42) [__::math::geometry::radToDeg__ *angle*](#43) [__::math::geometry::circle__ *centre* *radius*](#44) [__::math::geometry::circleTwoPoints__ *point1* *point2*](#45) [__::math::geometry::pointInsideCircle__ *point* *circle*](#46) [__::math::geometry::lineIntersectsCircle__ *line* *circle*](#47) [__::math::geometry::lineSegmentIntersectsCircle__ *segment* *circle*](#48) [__::math::geometry::intersectionLineWithCircle__ *line* *circle*](#49) [__::math::geometry::intersectionCircleWithCircle__ *circle1* *circle2*](#50) [__::math::geometry::tangentLinesToCircle__ *point* *circle*](#51) # <a name='description'></a>DESCRIPTION The __math::geometry__ package is a collection of functions for computations and manipulations on two\-dimensional geometrical objects, such as points, lines and polygons\. |
︙ | ︙ | |||
229 230 231 232 233 234 235 | Calculate the angle from the positive x\-axis to a given line \(in two dimensions only\)\. * list *line* Coordinates of the line | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 | Calculate the angle from the positive x\-axis to a given line \(in two dimensions only\)\. * list *line* Coordinates of the line - <a name='15'></a>__::math::geometry::angleBetween__ *vector1* *vector2* Calculate the angle between two vectors \(in degrees\) * list *vector1* First vector * list *vector2* Second vector - <a name='16'></a>__::math::geometry::inproduct__ *vector1* *vector2* Calculate the inner product of two vectors * list *vector1* First vector * list *vector2* Second vector - <a name='17'></a>__::math::geometry::areaParallellogram__ *vector1* *vector2* Calculate the area of the parallellogram with the two vectors as its sides * list *vector1* First vector * list *vector2* Second vector - <a name='18'></a>__::math::geometry::calculateDistanceToLine__ *P* *line* Calculate the distance of point P to the \(infinite\) line and return the result * list *P* List of two numbers, the coordinates of the point * list *line* List of four numbers, the coordinates of two points on the line - <a name='19'></a>__::math::geometry::calculateDistanceToLineSegment__ *P* *linesegment* Calculate the distance of point P to the \(finite\) line segment and return the result\. * list *P* List of two numbers, the coordinates of the point * list *linesegment* List of four numbers, the coordinates of the first and last points of the line segment - <a name='20'></a>__::math::geometry::calculateDistanceToPolyline__ *P* *polyline* Calculate the distance of point P to the polyline and return the result\. Note that a polyline needs not to be closed\. * list *P* List of two numbers, the coordinates of the point * list *polyline* List of numbers, the coordinates of the vertices of the polyline - <a name='21'></a>__::math::geometry::calculateDistanceToPolygon__ *P* *polygon* Calculate the distance of point P to the polygon and return the result\. If the list of coordinates is not closed \(first and last points differ\), it is automatically closed\. * list *P* List of two numbers, the coordinates of the point * list *polygon* List of numbers, the coordinates of the vertices of the polygon - <a name='22'></a>__::math::geometry::findClosestPointOnLine__ *P* *line* Return the point on a line which is closest to a given point\. * list *P* List of two numbers, the coordinates of the point * list *line* List of four numbers, the coordinates of two points on the line - <a name='23'></a>__::math::geometry::findClosestPointOnLineSegment__ *P* *linesegment* Return the point on a *line segment* which is closest to a given point\. * list *P* List of two numbers, the coordinates of the point * list *linesegment* List of four numbers, the first and last points on the line segment - <a name='24'></a>__::math::geometry::findClosestPointOnPolyline__ *P* *polyline* Return the point on a *polyline* which is closest to a given point\. * list *P* List of two numbers, the coordinates of the point * list *polyline* List of numbers, the vertices of the polyline - <a name='25'></a>__::math::geometry::lengthOfPolyline__ *polyline* Return the length of the *polyline* \(note: it not regarded as a polygon\) * list *polyline* List of numbers, the vertices of the polyline - <a name='26'></a>__::math::geometry::movePointInDirection__ *P* *direction* *dist* Move a point over a given distance in a given direction and return the new coordinates \(in two dimensions only\)\. * list *P* Coordinates of the point to be moved * double *direction* Direction \(in degrees; 0 is to the right, 90 upwards\) * list *dist* Distance over which to move the point - <a name='27'></a>__::math::geometry::lineSegmentsIntersect__ *linesegment1* *linesegment2* Check if two line segments intersect or coincide\. Returns 1 if that is the case, 0 otherwise \(in two dimensions only\)\. If an endpoint of one segment lies on the other segment \(or is very close to the segment\), they are considered to intersect * list *linesegment1* First line segment * list *linesegment2* Second line segment - <a name='28'></a>__::math::geometry::findLineSegmentIntersection__ *linesegment1* *linesegment2* Find the intersection point of two line segments\. Return the coordinates or the keywords "coincident" or "none" if the line segments coincide or have no points in common \(in two dimensions only\)\. * list *linesegment1* First line segment * list *linesegment2* Second line segment - <a name='29'></a>__::math::geometry::findLineIntersection__ *line1* *line2* Find the intersection point of two \(infinite\) lines\. Return the coordinates or the keywords "coincident" or "none" if the lines coincide or have no points in common \(in two dimensions only\)\. * list *line1* First line * list *line2* Second line See section [References](#section3) for details on the algorithm and math behind it\. - <a name='30'></a>__::math::geometry::polylinesIntersect__ *polyline1* *polyline2* Check if two polylines intersect or not \(in two dimensions only\)\. * list *polyline1* First polyline * list *polyline2* Second polyline - <a name='31'></a>__::math::geometry::polylinesBoundingIntersect__ *polyline1* *polyline2* *granularity* Check whether two polylines intersect, but reduce the correctness of the result to the given granularity\. Use this for faster, but weaker, intersection checking\. How it works: |
︙ | ︙ | |||
426 427 428 429 430 431 432 | Second polyline * int *granularity* Number of points in each part \(<=1 means check every edge\) | | | | 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 | Second polyline * int *granularity* Number of points in each part \(<=1 means check every edge\) - <a name='32'></a>__::math::geometry::intervalsOverlap__ *y1* *y2* *y3* *y4* *strict* Check if two intervals overlap\. * double *y1,y2* Begin and end of first interval * double *y3,y4* Begin and end of second interval * logical *strict* Check for strict or non\-strict overlap - <a name='33'></a>__::math::geometry::rectanglesOverlap__ *P1* *P2* *Q1* *Q2* *strict* Check if two rectangles overlap\. * list *P1* upper\-left corner of the first rectangle |
︙ | ︙ | |||
466 467 468 469 470 471 472 | lower\-right corner of the second rectangle * list *strict* choosing strict or non\-strict interpretation | | | | | | | | | | | | | | | | | | | | | | 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 | lower\-right corner of the second rectangle * list *strict* choosing strict or non\-strict interpretation - <a name='34'></a>__::math::geometry::bbox__ *polyline* Calculate the bounding box of a polyline\. Returns a list of four coordinates: the upper\-left and the lower\-right corner of the box\. * list *polyline* The polyline to be examined - <a name='35'></a>__::math::geometry::pointInsidePolygon__ *P* *polyline* Determine if a point is completely inside a polygon\. If the point touches the polygon, then the point is not completely inside the polygon\. * list *P* Coordinates of the point * list *polyline* The polyline to be examined - <a name='36'></a>__::math::geometry::pointInsidePolygonAlt__ *P* *polyline* Determine if a point is completely inside a polygon\. If the point touches the polygon, then the point is not completely inside the polygon\. *Note:* this alternative procedure uses the so\-called winding number to determine this\. It handles self\-intersecting polygons in a "natural" way\. * list *P* Coordinates of the point * list *polyline* The polyline to be examined - <a name='37'></a>__::math::geometry::rectangleInsidePolygon__ *P1* *P2* *polyline* Determine if a rectangle is completely inside a polygon\. If polygon touches the rectangle, then the rectangle is not complete inside the polygon\. * list *P1* Upper\-left corner of the rectangle * list *P2* Lower\-right corner of the rectangle * list *polygon* The polygon in question - <a name='38'></a>__::math::geometry::areaPolygon__ *polygon* Calculate the area of a polygon\. * list *polygon* The polygon in question - <a name='39'></a>__::math::geometry::translate__ *vector* *polyline* Translate a polyline over a given vector * list *vector* Translation vector * list *polyline* The polyline to be translated - <a name='40'></a>__::math::geometry::rotate__ *angle* *polyline* Rotate a polyline over a given angle \(degrees\) around the origin * list *angle* Angle over which to rotate the polyline \(degrees\) * list *polyline* The polyline to be rotated - <a name='41'></a>__::math::geometry::reflect__ *angle* *polyline* Reflect a polyline in a line through the origin at a given angle \(degrees\) to the x\-axis * list *angle* Angle of the line of reflection \(degrees\) * list *polyline* The polyline to be reflected - <a name='42'></a>__::math::geometry::degToRad__ *angle* Convert from degrees to radians * list *angle* Angle in degrees - <a name='43'></a>__::math::geometry::radToDeg__ *angle* Convert from radians to degrees * list *angle* Angle in radians - <a name='44'></a>__::math::geometry::circle__ *centre* *radius* Convenience procedure to create a circle from a point and a radius\. * list *centre* Coordinates of the circle centre * list *radius* Radius of the circle - <a name='45'></a>__::math::geometry::circleTwoPoints__ *point1* *point2* Convenience procedure to create a circle from two points on its circumference The centre is the point between the two given points, the radius is half the distance between them\. * list *point1* First point * list *point2* Second point - <a name='46'></a>__::math::geometry::pointInsideCircle__ *point* *circle* Determine if the given point is inside the circle or on the circumference \(1\) or outside \(0\)\. * list *point* Point to be checked * list *circle* Circle that may or may not contain the point - <a name='47'></a>__::math::geometry::lineIntersectsCircle__ *line* *circle* Determine if the given line intersects the circle or touches it \(1\) or does not \(0\)\. * list *line* Line to be checked * list *circle* Circle that may or may not be intersected - <a name='48'></a>__::math::geometry::lineSegmentIntersectsCircle__ *segment* *circle* Determine if the given line segment intersects the circle or touches it \(1\) or does not \(0\)\. * list *segment* Line segment to be checked * list *circle* Circle that may or may not be intersected - <a name='49'></a>__::math::geometry::intersectionLineWithCircle__ *line* *circle* Determine the points at which the given line intersects the circle\. There can be zero, one or two points\. \(If the line touches the circle or is close to it, then one point is returned\. An arbitrary margin of 1\.0e\-10 times the radius is used to determine this situation\.\) * list *line* Line to be checked * list *circle* Circle that may or may not be intersected - <a name='50'></a>__::math::geometry::intersectionCircleWithCircle__ *circle1* *circle2* Determine the points at which the given two circles intersect\. There can be zero, one or two points\. \(If the two circles touch the circle or are very close, then one point is returned\. An arbitrary margin of 1\.0e\-10 times the mean of the radii of the two circles is used to determine this situation\.\) * list *circle1* First circle * list *circle2* Second circle - <a name='51'></a>__::math::geometry::tangentLinesToCircle__ *point* *circle* Determine the tangent lines from the given point to the circle\. There can be zero, one or two lines\. \(If the point is on the cirucmference or very close to the circle, then one line is returned\. An arbitrary margin of 1\.0e\-10 times the radius of the circle is used to determine this situation\.\) * list *point* |
︙ | ︙ |
Changes to embedded/md/tcllib/files/modules/math/special.md.
1 2 3 4 | [//000000001]: # (math::special \- Tcl Math Library) [//000000002]: # (Generated from file 'special\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2004 Arjen Markus <arjenmarkus@users\.sourceforge\.net>) | | | 1 2 3 4 5 6 7 8 9 10 11 12 | [//000000001]: # (math::special \- Tcl Math Library) [//000000002]: # (Generated from file 'special\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2004 Arjen Markus <arjenmarkus@users\.sourceforge\.net>) [//000000004]: # (math::special\(n\) 0\.4 tcllib "Tcl Math Library") <hr> [ <a href="../../../../toc.md">Main Table Of Contents</a> | <a href="../../../toc.md">Table Of Contents</a> | <a href="../../../../index.md">Keyword Index</a> | <a href="../../../../toc0.md">Categories</a> | <a href="../../../../toc1.md">Modules</a> | <a href="../../../../toc2.md">Applications</a> ] <hr> |
︙ | ︙ | |||
37 38 39 40 41 42 43 | - [Category](#category) - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS | | | > > | > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | - [Category](#category) - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl ?8\.5? package require math::special ?0\.4? [__::math::special::Beta__ *x* *y*](#1) [__::math::special::incBeta__ *a* *b* *x*](#2) [__::math::special::regIncBeta__ *a* *b* *x*](#3) [__::math::special::Gamma__ *x*](#4) [__::math::special::digamma__ *x*](#5) [__::math::special::erf__ *x*](#6) [__::math::special::erfc__ *x*](#7) [__::math::special::invnorm__ *p*](#8) [__::math::special::J0__ *x*](#9) [__::math::special::J1__ *x*](#10) [__::math::special::Jn__ *n* *x*](#11) [__::math::special::J1/2__ *x*](#12) [__::math::special::J\-1/2__ *x*](#13) [__::math::special::I\_n__ *x*](#14) [__::math::special::cn__ *u* *k*](#15) [__::math::special::dn__ *u* *k*](#16) [__::math::special::sn__ *u* *k*](#17) [__::math::special::elliptic\_K__ *k*](#18) [__::math::special::elliptic\_E__ *k*](#19) [__::math::special::exponential\_Ei__ *x*](#20) [__::math::special::exponential\_En__ *n* *x*](#21) [__::math::special::exponential\_li__ *x*](#22) [__::math::special::exponential\_Ci__ *x*](#23) [__::math::special::exponential\_Si__ *x*](#24) [__::math::special::exponential\_Chi__ *x*](#25) [__::math::special::exponential\_Shi__ *x*](#26) [__::math::special::fresnel\_C__ *x*](#27) [__::math::special::fresnel\_S__ *x*](#28) [__::math::special::sinc__ *x*](#29) [__::math::special::legendre__ *n*](#30) [__::math::special::chebyshev__ *n*](#31) [__::math::special::laguerre__ *alpha* *n*](#32) [__::math::special::hermite__ *n*](#33) # <a name='description'></a>DESCRIPTION This package implements several so\-called special functions, like the Gamma function, the Bessel functions and such\. Each function is implemented by a procedure that bears its name \(well, in close |
︙ | ︙ | |||
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | | | | | Fresnel | C | all of R | -- | < 2.0e-3 integrals | S | all of R | -- | < 2.0e-3 | | | | general | Beta | (see Gamma) | -- | < 1.0e-9 | Gamma | x != 0,-1, | -- | < 1.0e-9 | | -2, ... | | | sinc | all of R | -- | exact | | | | orthogonal | Legendre | all of R | n = 0,1,... | exact polynomials | Chebyshev | all of R | n = 0,1,... | exact | Laguerre | all of R | n = 0,1,... | exact | | | alpha el. R | | Hermite | all of R | n = 0,1,... | exact *Note:* Some of the error bounds are estimated, as no "formal" bounds were available with the implemented approximation method, others hold for the auxiliary functions used for estimating the primary functions\. The following well\-known functions are currently missing from the package: - Bessel functions of the second kind \(Y\_n, K\_n\) - Bessel functions of arbitrary order \(and hence the Airy functions\) - Chebyshev polynomials of the second kind \(U\_n\) | > > > > > < < | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 | | | | | Fresnel | C | all of R | -- | < 2.0e-3 integrals | S | all of R | -- | < 2.0e-3 | | | | general | Beta | (see Gamma) | -- | < 1.0e-9 | Gamma | x != 0,-1, | -- | < 1.0e-9 | | -2, ... | | | incBeta | | a, b > 0 | < 1.0e-9 | regIncBeta | | a, b > 0 | < 1.0e-9 | digamma | x != 0,-1 | | < 1.0e-9 | | -2, ... | | | | | | | sinc | all of R | -- | exact | | | | orthogonal | Legendre | all of R | n = 0,1,... | exact polynomials | Chebyshev | all of R | n = 0,1,... | exact | Laguerre | all of R | n = 0,1,... | exact | | | alpha el. R | | Hermite | all of R | n = 0,1,... | exact *Note:* Some of the error bounds are estimated, as no "formal" bounds were available with the implemented approximation method, others hold for the auxiliary functions used for estimating the primary functions\. The following well\-known functions are currently missing from the package: - Bessel functions of the second kind \(Y\_n, K\_n\) - Bessel functions of arbitrary order \(and hence the Airy functions\) - Chebyshev polynomials of the second kind \(U\_n\) - The incomplete gamma function # <a name='section3'></a>PROCEDURES The package defines the following public procedures: - <a name='1'></a>__::math::special::Beta__ *x* *y* Compute the Beta function for arguments "x" and "y" * float *x* First argument for the Beta function * float *y* Second argument for the Beta function - <a name='2'></a>__::math::special::incBeta__ *a* *b* *x* Compute the incomplete Beta function for argument "x" with parameters "a" and "b" * float *a* First parameter for the incomplete Beta function, a > 0 * float *b* Second parameter for the incomplete Beta function, b > 0 * float *x* Argument for the incomplete Beta function - <a name='3'></a>__::math::special::regIncBeta__ *a* *b* *x* Compute the regularized incomplete Beta function for argument "x" with parameters "a" and "b" * float *a* First parameter for the incomplete Beta function, a > 0 * float *b* Second parameter for the incomplete Beta function, b > 0 * float *x* Argument for the regularized incomplete Beta function - <a name='4'></a>__::math::special::Gamma__ *x* Compute the Gamma function for argument "x" * float *x* Argument for the Gamma function - <a name='5'></a>__::math::special::digamma__ *x* Compute the digamma function \(psi\) for argument "x" * float *x* Argument for the digamma function - <a name='6'></a>__::math::special::erf__ *x* Compute the error function for argument "x" * float *x* Argument for the error function - <a name='7'></a>__::math::special::erfc__ *x* Compute the complementary error function for argument "x" * float *x* Argument for the complementary error function - <a name='8'></a>__::math::special::invnorm__ *p* Compute the inverse of the normal distribution function for argument "p" * float *p* Argument for the inverse normal distribution function \(p must be greater than 0 and lower than 1\) - <a name='9'></a>__::math::special::J0__ *x* Compute the zeroth\-order Bessel function of the first kind for the argument "x" * float *x* Argument for the Bessel function - <a name='10'></a>__::math::special::J1__ *x* Compute the first\-order Bessel function of the first kind for the argument "x" * float *x* Argument for the Bessel function - <a name='11'></a>__::math::special::Jn__ *n* *x* Compute the nth\-order Bessel function of the first kind for the argument "x" * integer *n* Order of the Bessel function * float *x* Argument for the Bessel function - <a name='12'></a>__::math::special::J1/2__ *x* Compute the half\-order Bessel function of the first kind for the argument "x" * float *x* Argument for the Bessel function - <a name='13'></a>__::math::special::J\-1/2__ *x* Compute the minus\-half\-order Bessel function of the first kind for the argument "x" * float *x* Argument for the Bessel function - <a name='14'></a>__::math::special::I\_n__ *x* Compute the modified Bessel function of the first kind of order n for the argument "x" * int *x* Positive integer order of the function * float *x* Argument for the function - <a name='15'></a>__::math::special::cn__ *u* *k* Compute the elliptic function *cn* for the argument "u" and parameter "k"\. * float *u* Argument for the function * float *k* Parameter - <a name='16'></a>__::math::special::dn__ *u* *k* Compute the elliptic function *dn* for the argument "u" and parameter "k"\. * float *u* Argument for the function * float *k* Parameter - <a name='17'></a>__::math::special::sn__ *u* *k* Compute the elliptic function *sn* for the argument "u" and parameter "k"\. * float *u* Argument for the function * float *k* Parameter - <a name='18'></a>__::math::special::elliptic\_K__ *k* Compute the complete elliptic integral of the first kind for the argument "k" * float *k* Argument for the function - <a name='19'></a>__::math::special::elliptic\_E__ *k* Compute the complete elliptic integral of the second kind for the argument "k" * float *k* Argument for the function - <a name='20'></a>__::math::special::exponential\_Ei__ *x* Compute the exponential integral of the second kind for the argument "x" * float *x* Argument for the function \(x \!= 0\) - <a name='21'></a>__::math::special::exponential\_En__ *n* *x* Compute the exponential integral of the first kind for the argument "x" and order n * int *n* Order of the integral \(n >= 0\) * float *x* Argument for the function \(x >= 0\) - <a name='22'></a>__::math::special::exponential\_li__ *x* Compute the logarithmic integral for the argument "x" * float *x* Argument for the function \(x > 0\) - <a name='23'></a>__::math::special::exponential\_Ci__ *x* Compute the cosine integral for the argument "x" * float *x* Argument for the function \(x > 0\) - <a name='24'></a>__::math::special::exponential\_Si__ *x* Compute the sine integral for the argument "x" * float *x* Argument for the function \(x > 0\) - <a name='25'></a>__::math::special::exponential\_Chi__ *x* Compute the hyperbolic cosine integral for the argument "x" * float *x* Argument for the function \(x > 0\) - <a name='26'></a>__::math::special::exponential\_Shi__ *x* Compute the hyperbolic sine integral for the argument "x" * float *x* Argument for the function \(x > 0\) - <a name='27'></a>__::math::special::fresnel\_C__ *x* Compute the Fresnel cosine integral for real argument x * float *x* Argument for the function - <a name='28'></a>__::math::special::fresnel\_S__ *x* Compute the Fresnel sine integral for real argument x * float *x* Argument for the function - <a name='29'></a>__::math::special::sinc__ *x* Compute the sinc function for real argument x * float *x* Argument for the function - <a name='30'></a>__::math::special::legendre__ *n* Return the Legendre polynomial of degree n \(see [THE ORTHOGONAL POLYNOMIALS](#section4)\) * int *n* Degree of the polynomial - <a name='31'></a>__::math::special::chebyshev__ *n* Return the Chebyshev polynomial of degree n \(of the first kind\) * int *n* Degree of the polynomial - <a name='32'></a>__::math::special::laguerre__ *alpha* *n* Return the Laguerre polynomial of degree n with parameter alpha * float *alpha* Parameter of the Laguerre polynomial * int *n* Degree of the polynomial - <a name='33'></a>__::math::special::hermite__ *n* Return the Hermite polynomial of degree n * int *n* Degree of the polynomial |
︙ | ︙ |
Changes to embedded/md/tcllib/files/modules/math/statistics.md.
︙ | ︙ | |||
80 81 82 83 84 85 86 | [__::math::statistics::print\-2x2__ *n11* *n21* *n12* *n22*](#31) [__::math::statistics::control\-xbar__ *data* ?nsamples?](#32) [__::math::statistics::control\-Rchart__ *data* ?nsamples?](#33) [__::math::statistics::test\-xbar__ *control* *data*](#34) [__::math::statistics::test\-Rchart__ *control* *data*](#35) [__::math::statistics::test\-Kruskal\-Wallis__ *confidence* *args*](#36) [__::math::statistics::analyse\-Kruskal\-Wallis__ *args*](#37) | > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > | | | | | | | | | | | | | | | > > > | | | | | | | | | | | | | | | | > > > | | | | | > > | | | | | | | | | | | 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | [__::math::statistics::print\-2x2__ *n11* *n21* *n12* *n22*](#31) [__::math::statistics::control\-xbar__ *data* ?nsamples?](#32) [__::math::statistics::control\-Rchart__ *data* ?nsamples?](#33) [__::math::statistics::test\-xbar__ *control* *data*](#34) [__::math::statistics::test\-Rchart__ *control* *data*](#35) [__::math::statistics::test\-Kruskal\-Wallis__ *confidence* *args*](#36) [__::math::statistics::analyse\-Kruskal\-Wallis__ *args*](#37) [__::math::statistics::test\-Levene__ *groups*](#38) [__::math::statistics::test\-Brown\-Forsythe__ *groups*](#39) [__::math::statistics::group\-rank__ *args*](#40) [__::math::statistics::test\-Wilcoxon__ *sample\_a* *sample\_b*](#41) [__::math::statistics::spearman\-rank__ *sample\_a* *sample\_b*](#42) [__::math::statistics::spearman\-rank\-extended__ *sample\_a* *sample\_b*](#43) [__::math::statistics::kernel\-density__ *data* opt *\-option value* \.\.\.](#44) [__::math::statistics::bootstrap__ *data* *sampleSize* ?numberSamples?](#45) [__::math::statistics::wasserstein\-distance__ *prob1* *prob2*](#46) [__::math::statistics::kl\-divergence__ *prob1* *prob2*](#47) [__::math::statistics::logistic\-model__ *xdata* *ydata*](#48) [__::math::statistics::logistic\-probability__ *coeffs* *x*](#49) [__::math::statistics::tstat__ *dof* ?alpha?](#50) [__::math::statistics::mv\-wls__ *wt1* *weights\_and\_values*](#51) [__::math::statistics::mv\-ols__ *values*](#52) [__::math::statistics::pdf\-normal__ *mean* *stdev* *value*](#53) [__::math::statistics::pdf\-lognormal__ *mean* *stdev* *value*](#54) [__::math::statistics::pdf\-exponential__ *mean* *value*](#55) [__::math::statistics::pdf\-uniform__ *xmin* *xmax* *value*](#56) [__::math::statistics::pdf\-triangular__ *xmin* *xmax* *value*](#57) [__::math::statistics::pdf\-symmetric\-triangular__ *xmin* *xmax* *value*](#58) [__::math::statistics::pdf\-gamma__ *alpha* *beta* *value*](#59) [__::math::statistics::pdf\-poisson__ *mu* *k*](#60) [__::math::statistics::pdf\-chisquare__ *df* *value*](#61) [__::math::statistics::pdf\-student\-t__ *df* *value*](#62) [__::math::statistics::pdf\-gamma__ *a* *b* *value*](#63) [__::math::statistics::pdf\-beta__ *a* *b* *value*](#64) [__::math::statistics::pdf\-weibull__ *scale* *shape* *value*](#65) [__::math::statistics::pdf\-gumbel__ *location* *scale* *value*](#66) [__::math::statistics::pdf\-pareto__ *scale* *shape* *value*](#67) [__::math::statistics::pdf\-cauchy__ *location* *scale* *value*](#68) [__::math::statistics::pdf\-laplace__ *location* *scale* *value*](#69) [__::math::statistics::pdf\-kumaraswamy__ *a* *b* *value*](#70) [__::math::statistics::pdf\-negative\-binomial__ *r* *p* *value*](#71) [__::math::statistics::cdf\-normal__ *mean* *stdev* *value*](#72) [__::math::statistics::cdf\-lognormal__ *mean* *stdev* *value*](#73) [__::math::statistics::cdf\-exponential__ *mean* *value*](#74) [__::math::statistics::cdf\-uniform__ *xmin* *xmax* *value*](#75) [__::math::statistics::cdf\-triangular__ *xmin* *xmax* *value*](#76) [__::math::statistics::cdf\-symmetric\-triangular__ *xmin* *xmax* *value*](#77) [__::math::statistics::cdf\-students\-t__ *degrees* *value*](#78) [__::math::statistics::cdf\-gamma__ *alpha* *beta* *value*](#79) [__::math::statistics::cdf\-poisson__ *mu* *k*](#80) [__::math::statistics::cdf\-beta__ *a* *b* *value*](#81) [__::math::statistics::cdf\-weibull__ *scale* *shape* *value*](#82) [__::math::statistics::cdf\-gumbel__ *location* *scale* *value*](#83) [__::math::statistics::cdf\-pareto__ *scale* *shape* *value*](#84) [__::math::statistics::cdf\-cauchy__ *location* *scale* *value*](#85) [__::math::statistics::cdf\-F__ *nf1* *nf2* *value*](#86) [__::math::statistics::cdf\-laplace__ *location* *scale* *value*](#87) [__::math::statistics::cdf\-kumaraswamy__ *a* *b* *value*](#88) [__::math::statistics::cdf\-negative\-binomial__ *r* *p* *value*](#89) [__::math::statistics::empirical\-distribution__ *values*](#90) [__::math::statistics::random\-normal__ *mean* *stdev* *number*](#91) [__::math::statistics::random\-lognormal__ *mean* *stdev* *number*](#92) [__::math::statistics::random\-exponential__ *mean* *number*](#93) [__::math::statistics::random\-uniform__ *xmin* *xmax* *number*](#94) [__::math::statistics::random\-triangular__ *xmin* *xmax* *number*](#95) [__::math::statistics::random\-symmetric\-triangular__ *xmin* *xmax* *number*](#96) [__::math::statistics::random\-gamma__ *alpha* *beta* *number*](#97) [__::math::statistics::random\-poisson__ *mu* *number*](#98) [__::math::statistics::random\-chisquare__ *df* *number*](#99) [__::math::statistics::random\-student\-t__ *df* *number*](#100) [__::math::statistics::random\-beta__ *a* *b* *number*](#101) [__::math::statistics::random\-weibull__ *scale* *shape* *number*](#102) [__::math::statistics::random\-gumbel__ *location* *scale* *number*](#103) [__::math::statistics::random\-pareto__ *scale* *shape* *number*](#104) [__::math::statistics::random\-cauchy__ *location* *scale* *number*](#105) [__::math::statistics::random\-laplace__ *location* *scale* *number*](#106) [__::math::statistics::random\-kumaraswamy__ *a* *b* *number*](#107) [__::math::statistics::random\-negative\-binomial__ *r* *p* *number*](#108) [__::math::statistics::histogram\-uniform__ *xmin* *xmax* *limits* *number*](#109) [__::math::statistics::incompleteGamma__ *x* *p* ?tol?](#110) [__::math::statistics::incompleteBeta__ *a* *b* *x* ?tol?](#111) [__::math::statistics::estimate\-pareto__ *values*](#112) [__::math::statistics::estimate\-exponential__ *values*](#113) [__::math::statistics::estimate\-laplace__ *values*](#114) [__::math::statistics::estimante\-negative\-binomial__ *r* *values*](#115) [__::math::statistics::filter__ *varname* *data* *expression*](#116) [__::math::statistics::map__ *varname* *data* *expression*](#117) [__::math::statistics::samplescount__ *varname* *list* *expression*](#118) [__::math::statistics::subdivide__](#119) [__::math::statistics::plot\-scale__ *canvas* *xmin* *xmax* *ymin* *ymax*](#120) [__::math::statistics::plot\-xydata__ *canvas* *xdata* *ydata* *tag*](#121) [__::math::statistics::plot\-xyline__ *canvas* *xdata* *ydata* *tag*](#122) [__::math::statistics::plot\-tdata__ *canvas* *tdata* *tag*](#123) [__::math::statistics::plot\-tline__ *canvas* *tdata* *tag*](#124) [__::math::statistics::plot\-histogram__ *canvas* *counts* *limits* *tag*](#125) # <a name='description'></a>DESCRIPTION The __math::statistics__ package contains functions and procedures for basic statistical data analysis, such as: - Descriptive statistical parameters \(mean, minimum, maximum, standard |
︙ | ︙ | |||
783 784 785 786 787 788 789 | Kruskal\-Wallis statistic and the probability that that value would occur assuming the medians of the populations are equal\. * list *args* \- Two or more lists of data | | > > > > > > > > > > > > > > > > > > > > > > > | | | | | | 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 | Kruskal\-Wallis statistic and the probability that that value would occur assuming the medians of the populations are equal\. * list *args* \- Two or more lists of data - <a name='38'></a>__::math::statistics::test\-Levene__ *groups* Compute the Levene statistic to determine if groups of data have the same variance \(are homoscadastic\) or not\. The data are organised in groups\. This version uses the mean of the data as the measure to determine the deviations\. The statistic is equivalent to an F statistic with degrees of freedom k\-1 and N\-k, k being the number of groups and N the total number of data\. * list *groups* \- List of groups of data - <a name='39'></a>__::math::statistics::test\-Brown\-Forsythe__ *groups* Compute the Brown\-Forsythe statistic to determine if groups of data have the same variance \(are homoscadastic\) or not\. Like the Levene test, but this version uses the median of the data\. * list *groups* \- List of groups of data - <a name='40'></a>__::math::statistics::group\-rank__ *args* Rank the groups of data with respect to the complete set\. Returns a list consisting of the group ID, the value and the rank \(possibly a rational number, in case of ties\) for each data item\. * list *args* \- Two or more lists of data - <a name='41'></a>__::math::statistics::test\-Wilcoxon__ *sample\_a* *sample\_b* Compute the Wilcoxon test statistic to determine if two samples have the same median or not\. \(The statistic can be regarded as standard normal, if the sample sizes are both larger than 10\.\) Returns the value of this statistic\. * list *sample\_a* \- List of data comprising the first sample * list *sample\_b* \- List of data comprising the second sample - <a name='42'></a>__::math::statistics::spearman\-rank__ *sample\_a* *sample\_b* Return the Spearman rank correlation as an alternative to the ordinary \(Pearson's\) correlation coefficient\. The two samples should have the same number of data\. * list *sample\_a* \- First list of data * list *sample\_b* \- Second list of data - <a name='43'></a>__::math::statistics::spearman\-rank\-extended__ *sample\_a* *sample\_b* Return the Spearman rank correlation as an alternative to the ordinary \(Pearson's\) correlation coefficient as well as additional data\. The two samples should have the same number of data\. The procedure returns the correlation coefficient, the number of data pairs used and the z\-score, an approximately standard normal statistic, indicating the significance of the correlation\. * list *sample\_a* \- First list of data * list *sample\_b* \- Second list of data - <a name='44'></a>__::math::statistics::kernel\-density__ *data* opt *\-option value* \.\.\. Return the density function based on kernel density estimation\. The procedure is controlled by a small set of options, each of which is given a reasonable default\. The return value consists of three lists: the centres of the bins, the associated probability density and a list of computational parameters \(begin |
︙ | ︙ | |||
881 882 883 884 885 886 887 | \(default: mean \+/\- 3\*standard deviation\) + __\-kernel__ *function* Kernel to be used \(One of: gaussian, cosine, epanechnikov, uniform, triangular, biweight, logistic; default: gaussian\) | | | | | 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 | \(default: mean \+/\- 3\*standard deviation\) + __\-kernel__ *function* Kernel to be used \(One of: gaussian, cosine, epanechnikov, uniform, triangular, biweight, logistic; default: gaussian\) - <a name='45'></a>__::math::statistics::bootstrap__ *data* *sampleSize* ?numberSamples? Create a subsample or subsamples from a given list of data\. The data in the samples are chosen from this list \- multiples may occur\. If there is only one subsample, the sample itself is returned \(as a list of "sampleSize" values\), otherwise a list of samples is returned\. * list *data* List of values to chose from * int *sampleSize* Number of values per sample * int *numberSamples* Number of samples \(default: 1\) - <a name='46'></a>__::math::statistics::wasserstein\-distance__ *prob1* *prob2* Compute the Wasserstein distance or earth mover's distance for two equidstantly spaced histograms or probability densities\. The histograms need not to be normalised to sum to one, but they must have the same number of entries\. Note: the histograms are assumed to be based on the same equidistant intervals\. As the bounds are not passed, the value is expressed in the length of the intervals\. * list *prob1* List of values for the first histogram/probability density * list *prob2* List of values for the second histogram/probability density - <a name='47'></a>__::math::statistics::kl\-divergence__ *prob1* *prob2* Compute the Kullback\-Leibler \(KL\) divergence for two equidstantly spaced histograms or probability densities\. The histograms need not to be normalised to sum to one, but they must have the same number of entries\. Note: the histograms are assumed to be based on the same equidistant intervals\. As the bounds are not passed, the value is expressed in the |
︙ | ︙ | |||
941 942 943 944 945 946 947 | List of values for the first histogram/probability density * list *prob2* List of values for the second histogram/probability density | | | | 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 | List of values for the first histogram/probability density * list *prob2* List of values for the second histogram/probability density - <a name='48'></a>__::math::statistics::logistic\-model__ *xdata* *ydata* Estimate the coefficients of the logistic model that fits the data best\. The data consist of independent x\-values and the outcome 0 or 1 for each of the x\-values\. The result can be used to estimate the probability that a certain x\-value gives 1\. * list *xdata* List of values for which the success \(1\) or failure \(0\) is known * list *ydata* List of successes or failures corresponding to each value in *xdata*\. - <a name='49'></a>__::math::statistics::logistic\-probability__ *coeffs* *x* Calculate the probability of success for the value *x* given the coefficients of the logistic model\. * list *coeffs* List of coefficients as determine by the __logistic\-model__ command |
︙ | ︙ | |||
984 985 986 987 988 989 990 | value of the t\-statistic for the specified number of degrees of freedom that is required to demonstrate a given level of significance\. Note: These procedures depend on the math::linearalgebra package\. *Description of the procedures* | | | 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 | value of the t\-statistic for the specified number of degrees of freedom that is required to demonstrate a given level of significance\. Note: These procedures depend on the math::linearalgebra package\. *Description of the procedures* - <a name='50'></a>__::math::statistics::tstat__ *dof* ?alpha? Returns the value of the t\-distribution t\* satisfying P(t*) = 1 - alpha/2 P(-t*) = alpha/2 for the number of degrees of freedom dof\. |
︙ | ︙ | |||
1011 1012 1013 1014 1015 1016 1017 | Number of degrees of freedom * float *alpha* Confidence level of the t\-distribution\. Defaults to 0\.05\. | | | 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 | Number of degrees of freedom * float *alpha* Confidence level of the t\-distribution\. Defaults to 0\.05\. - <a name='51'></a>__::math::statistics::mv\-wls__ *wt1* *weights\_and\_values* Carries out a weighted least squares linear regression for the data points provided, with weights assigned to each point\. The linear model is of the form y = b0 + b1 * x1 + b2 * x2 ... + bN * xN + error |
︙ | ︙ | |||
1048 1049 1050 1051 1052 1053 1054 | A list consisting of: the weight for the first observation, the data for the first observation \(as a sublist\), the weight for the second observation \(as a sublist\) and so on\. The sublists of data are organised as lists of the value of the dependent variable y and the independent variables x1, x2 to xN\. | | | 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 | A list consisting of: the weight for the first observation, the data for the first observation \(as a sublist\), the weight for the second observation \(as a sublist\) and so on\. The sublists of data are organised as lists of the value of the dependent variable y and the independent variables x1, x2 to xN\. - <a name='52'></a>__::math::statistics::mv\-ols__ *values* Carries out an ordinary least squares linear regression for the data points provided\. This procedure simply calls ::mvlinreg::wls with the weights set to 1\.0, and returns the same information\. |
︙ | ︙ | |||
1135 1136 1137 1138 1139 1140 1141 | - Histograms for the given distribution \(histogram\-\*\) - List of random values with the given distribution \(random\-\*\) The following procedures have been implemented: | | | | | | | | | | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 | - Histograms for the given distribution \(histogram\-\*\) - List of random values with the given distribution \(random\-\*\) The following procedures have been implemented: - <a name='53'></a>__::math::statistics::pdf\-normal__ *mean* *stdev* *value* Return the probability of a given value for a normal distribution with given mean and standard deviation\. * float *mean* \- Mean value of the distribution * float *stdev* \- Standard deviation of the distribution * float *value* \- Value for which the probability is required - <a name='54'></a>__::math::statistics::pdf\-lognormal__ *mean* *stdev* *value* Return the probability of a given value for a log\-normal distribution with given mean and standard deviation\. * float *mean* \- Mean value of the distribution * float *stdev* \- Standard deviation of the distribution * float *value* \- Value for which the probability is required - <a name='55'></a>__::math::statistics::pdf\-exponential__ *mean* *value* Return the probability of a given value for an exponential distribution with given mean\. * float *mean* \- Mean value of the distribution * float *value* \- Value for which the probability is required - <a name='56'></a>__::math::statistics::pdf\-uniform__ *xmin* *xmax* *value* Return the probability of a given value for a uniform distribution with given extremes\. * float *xmin* \- Minimum value of the distribution * float *xmin* \- Maximum value of the distribution * float *value* \- Value for which the probability is required - <a name='57'></a>__::math::statistics::pdf\-triangular__ *xmin* *xmax* *value* Return the probability of a given value for a triangular distribution with given extremes\. If the argument min is lower than the argument max, then smaller values have higher probability and vice versa\. In the first case the probability density function is of the form *f\(x\) = 2\(1\-x\)* and the other case it is of the form *f\(x\) = 2x*\. * float *xmin* \- Minimum value of the distribution * float *xmin* \- Maximum value of the distribution * float *value* \- Value for which the probability is required - <a name='58'></a>__::math::statistics::pdf\-symmetric\-triangular__ *xmin* *xmax* *value* Return the probability of a given value for a symmetric triangular distribution with given extremes\. * float *xmin* \- Minimum value of the distribution * float *xmin* \- Maximum value of the distribution * float *value* \- Value for which the probability is required - <a name='59'></a>__::math::statistics::pdf\-gamma__ *alpha* *beta* *value* Return the probability of a given value for a Gamma distribution with given shape and rate parameters * float *alpha* \- Shape parameter * float *beta* \- Rate parameter * float *value* \- Value for which the probability is required - <a name='60'></a>__::math::statistics::pdf\-poisson__ *mu* *k* Return the probability of a given number of occurrences in the same interval \(k\) for a Poisson distribution with given mean \(mu\) * float *mu* \- Mean number of occurrences * int *k* \- Number of occurences - <a name='61'></a>__::math::statistics::pdf\-chisquare__ *df* *value* Return the probability of a given value for a chi square distribution with given degrees of freedom * float *df* \- Degrees of freedom * float *value* \- Value for which the probability is required - <a name='62'></a>__::math::statistics::pdf\-student\-t__ *df* *value* Return the probability of a given value for a Student's t distribution with given degrees of freedom * float *df* \- Degrees of freedom * float *value* \- Value for which the probability is required - <a name='63'></a>__::math::statistics::pdf\-gamma__ *a* *b* *value* Return the probability of a given value for a Gamma distribution with given shape and rate parameters * float *a* \- Shape parameter * float *b* \- Rate parameter * float *value* \- Value for which the probability is required - <a name='64'></a>__::math::statistics::pdf\-beta__ *a* *b* *value* Return the probability of a given value for a Beta distribution with given shape parameters * float *a* \- First shape parameter * float *b* \- Second shape parameter * float *value* \- Value for which the probability is required - <a name='65'></a>__::math::statistics::pdf\-weibull__ *scale* *shape* *value* Return the probability of a given value for a Weibull distribution with given scale and shape parameters * float *location* \- Scale parameter * float *scale* \- Shape parameter * float *value* \- Value for which the probability is required - <a name='66'></a>__::math::statistics::pdf\-gumbel__ *location* *scale* *value* Return the probability of a given value for a Gumbel distribution with given location and shape parameters * float *location* \- Location parameter * float *scale* \- Shape parameter * float *value* \- Value for which the probability is required - <a name='67'></a>__::math::statistics::pdf\-pareto__ *scale* *shape* *value* Return the probability of a given value for a Pareto distribution with given scale and shape parameters * float *scale* \- Scale parameter * float *shape* \- Shape parameter * float *value* \- Value for which the probability is required - <a name='68'></a>__::math::statistics::pdf\-cauchy__ *location* *scale* *value* Return the probability of a given value for a Cauchy distribution with given location and shape parameters\. Note that the Cauchy distribution has no finite higher\-order moments\. * float *location* \- Location parameter * float *scale* \- Shape parameter * float *value* \- Value for which the probability is required - <a name='69'></a>__::math::statistics::pdf\-laplace__ *location* *scale* *value* Return the probability of a given value for a Laplace distribution with given location and shape parameters\. The Laplace distribution consists of two exponential functions, is peaked and has heavier tails than the normal distribution\. * float *location* \- Location parameter \(mean\) * float *scale* \- Shape parameter * float *value* \- Value for which the probability is required - <a name='70'></a>__::math::statistics::pdf\-kumaraswamy__ *a* *b* *value* Return the probability of a given value for a Kumaraswamy distribution with given parameters a and b\. The Kumaraswamy distribution is related to the Beta distribution, but has a tractable cumulative distribution function\. * float *a* \- Parameter a * float *b* \- Parameter b * float *value* \- Value for which the probability is required - <a name='71'></a>__::math::statistics::pdf\-negative\-binomial__ *r* *p* *value* Return the probability of a given value for a negative binomial distribution with an allowed number of failures and the probability of success\. * int *r* \- Allowed number of failures \(at least 1\) * float *p* \- Probability of success * int *value* \- Number of successes for which the probability is to be returned - <a name='72'></a>__::math::statistics::cdf\-normal__ *mean* *stdev* *value* Return the cumulative probability of a given value for a normal distribution with given mean and standard deviation, that is the probability for values up to the given one\. * float *mean* \- Mean value of the distribution * float *stdev* \- Standard deviation of the distribution * float *value* \- Value for which the probability is required - <a name='73'></a>__::math::statistics::cdf\-lognormal__ *mean* *stdev* *value* Return the cumulative probability of a given value for a log\-normal distribution with given mean and standard deviation, that is the probability for values up to the given one\. * float *mean* \- Mean value of the distribution * float *stdev* \- Standard deviation of the distribution * float *value* \- Value for which the probability is required - <a name='74'></a>__::math::statistics::cdf\-exponential__ *mean* *value* Return the cumulative probability of a given value for an exponential distribution with given mean\. * float *mean* \- Mean value of the distribution * float *value* \- Value for which the probability is required - <a name='75'></a>__::math::statistics::cdf\-uniform__ *xmin* *xmax* *value* Return the cumulative probability of a given value for a uniform distribution with given extremes\. * float *xmin* \- Minimum value of the distribution * float *xmin* \- Maximum value of the distribution * float *value* \- Value for which the probability is required - <a name='76'></a>__::math::statistics::cdf\-triangular__ *xmin* *xmax* *value* Return the cumulative probability of a given value for a triangular distribution with given extremes\. If xmin < xmax, then lower values have a higher probability and vice versa, see also *pdf\-triangular* * float *xmin* \- Minimum value of the distribution * float *xmin* \- Maximum value of the distribution * float *value* \- Value for which the probability is required - <a name='77'></a>__::math::statistics::cdf\-symmetric\-triangular__ *xmin* *xmax* *value* Return the cumulative probability of a given value for a symmetric triangular distribution with given extremes\. * float *xmin* \- Minimum value of the distribution * float *xmin* \- Maximum value of the distribution * float *value* \- Value for which the probability is required - <a name='78'></a>__::math::statistics::cdf\-students\-t__ *degrees* *value* Return the cumulative probability of a given value for a Student's t distribution with given number of degrees\. * int *degrees* \- Number of degrees of freedom * float *value* \- Value for which the probability is required - <a name='79'></a>__::math::statistics::cdf\-gamma__ *alpha* *beta* *value* Return the cumulative probability of a given value for a Gamma distribution with given shape and rate parameters\. * float *alpha* \- Shape parameter * float *beta* \- Rate parameter * float *value* \- Value for which the cumulative probability is required - <a name='80'></a>__::math::statistics::cdf\-poisson__ *mu* *k* Return the cumulative probability of a given number of occurrences in the same interval \(k\) for a Poisson distribution with given mean \(mu\)\. * float *mu* \- Mean number of occurrences * int *k* \- Number of occurences - <a name='81'></a>__::math::statistics::cdf\-beta__ *a* *b* *value* Return the cumulative probability of a given value for a Beta distribution with given shape parameters * float *a* \- First shape parameter * float *b* \- Second shape parameter * float *value* \- Value for which the probability is required - <a name='82'></a>__::math::statistics::cdf\-weibull__ *scale* *shape* *value* Return the cumulative probability of a given value for a Weibull distribution with given scale and shape parameters\. * float *scale* \- Scale parameter * float *shape* \- Shape parameter * float *value* \- Value for which the probability is required - <a name='83'></a>__::math::statistics::cdf\-gumbel__ *location* *scale* *value* Return the cumulative probability of a given value for a Gumbel distribution with given location and scale parameters\. * float *location* \- Location parameter * float *scale* \- Scale parameter * float *value* \- Value for which the probability is required - <a name='84'></a>__::math::statistics::cdf\-pareto__ *scale* *shape* *value* Return the cumulative probability of a given value for a Pareto distribution with given scale and shape parameters * float *scale* \- Scale parameter * float *shape* \- Shape parameter * float *value* \- Value for which the probability is required - <a name='85'></a>__::math::statistics::cdf\-cauchy__ *location* *scale* *value* Return the cumulative probability of a given value for a Cauchy distribution with given location and scale parameters\. * float *location* \- Location parameter * float *scale* \- Scale parameter * float *value* \- Value for which the probability is required - <a name='86'></a>__::math::statistics::cdf\-F__ *nf1* *nf2* *value* Return the cumulative probability of a given value for an F distribution with nf1 and nf2 degrees of freedom\. * float *nf1* \- Degrees of freedom for the numerator * float *nf2* \- Degrees of freedom for the denominator * float *value* \- Value for which the probability is required - <a name='87'></a>__::math::statistics::cdf\-laplace__ *location* *scale* *value* Return the cumulative probability of a given value for a Laplace distribution with given location and shape parameters\. The Laplace distribution consists of two exponential functions, is peaked and has heavier tails than the normal distribution\. * float *location* \- Location parameter \(mean\) * float *scale* \- Shape parameter * float *value* \- Value for which the probability is required - <a name='88'></a>__::math::statistics::cdf\-kumaraswamy__ *a* *b* *value* Return the cumulative probability of a given value for a Kumaraswamy distribution with given parameters a and b\. The Kumaraswamy distribution is related to the Beta distribution, but has a tractable cumulative distribution function\. * float *a* \- Parameter a * float *b* \- Parameter b * float *value* \- Value for which the probability is required - <a name='89'></a>__::math::statistics::cdf\-negative\-binomial__ *r* *p* *value* Return the cumulative probability of a given value for a negative binomial distribution with an allowed number of failures and the probability of success\. * int *r* \- Allowed number of failures \(at least 1\) * float *p* \- Probability of success * int *value* \- Greatest number of successes - <a name='90'></a>__::math::statistics::empirical\-distribution__ *values* Return a list of values and their empirical probability\. The values are sorted in increasing order\. \(The implementation follows the description at the corresponding Wikipedia page\) * list *values* \- List of data to be examined - <a name='91'></a>__::math::statistics::random\-normal__ *mean* *stdev* *number* Return a list of "number" random values satisfying a normal distribution with given mean and standard deviation\. * float *mean* \- Mean value of the distribution * float *stdev* \- Standard deviation of the distribution * int *number* \- Number of values to be returned - <a name='92'></a>__::math::statistics::random\-lognormal__ *mean* *stdev* *number* Return a list of "number" random values satisfying a log\-normal distribution with given mean and standard deviation\. * float *mean* \- Mean value of the distribution * float *stdev* \- Standard deviation of the distribution * int *number* \- Number of values to be returned - <a name='93'></a>__::math::statistics::random\-exponential__ *mean* *number* Return a list of "number" random values satisfying an exponential distribution with given mean\. * float *mean* \- Mean value of the distribution * int *number* \- Number of values to be returned - <a name='94'></a>__::math::statistics::random\-uniform__ *xmin* *xmax* *number* Return a list of "number" random values satisfying a uniform distribution with given extremes\. * float *xmin* \- Minimum value of the distribution * float *xmax* \- Maximum value of the distribution * int *number* \- Number of values to be returned - <a name='95'></a>__::math::statistics::random\-triangular__ *xmin* *xmax* *number* Return a list of "number" random values satisfying a triangular distribution with given extremes\. If xmin < xmax, then lower values have a higher probability and vice versa \(see also *pdf\-triangular*\. * float *xmin* \- Minimum value of the distribution * float *xmax* \- Maximum value of the distribution * int *number* \- Number of values to be returned - <a name='96'></a>__::math::statistics::random\-symmetric\-triangular__ *xmin* *xmax* *number* Return a list of "number" random values satisfying a symmetric triangular distribution with given extremes\. * float *xmin* \- Minimum value of the distribution * float *xmax* \- Maximum value of the distribution * int *number* \- Number of values to be returned - <a name='97'></a>__::math::statistics::random\-gamma__ *alpha* *beta* *number* Return a list of "number" random values satisfying a Gamma distribution with given shape and rate parameters\. * float *alpha* \- Shape parameter * float *beta* \- Rate parameter * int *number* \- Number of values to be returned - <a name='98'></a>__::math::statistics::random\-poisson__ *mu* *number* Return a list of "number" random values satisfying a Poisson distribution with given mean\. * float *mu* \- Mean of the distribution * int *number* \- Number of values to be returned - <a name='99'></a>__::math::statistics::random\-chisquare__ *df* *number* Return a list of "number" random values satisfying a chi square distribution with given degrees of freedom\. * float *df* \- Degrees of freedom * int *number* \- Number of values to be returned - <a name='100'></a>__::math::statistics::random\-student\-t__ *df* *number* Return a list of "number" random values satisfying a Student's t distribution with given degrees of freedom\. * float *df* \- Degrees of freedom * int *number* \- Number of values to be returned - <a name='101'></a>__::math::statistics::random\-beta__ *a* *b* *number* Return a list of "number" random values satisfying a Beta distribution with given shape parameters\. * float *a* \- First shape parameter * float *b* \- Second shape parameter * int *number* \- Number of values to be returned - <a name='102'></a>__::math::statistics::random\-weibull__ *scale* *shape* *number* Return a list of "number" random values satisfying a Weibull distribution with given scale and shape parameters\. * float *scale* \- Scale parameter * float *shape* \- Shape parameter * int *number* \- Number of values to be returned - <a name='103'></a>__::math::statistics::random\-gumbel__ *location* *scale* *number* Return a list of "number" random values satisfying a Gumbel distribution with given location and scale parameters\. * float *location* \- Location parameter * float *scale* \- Scale parameter * int *number* \- Number of values to be returned - <a name='104'></a>__::math::statistics::random\-pareto__ *scale* *shape* *number* Return a list of "number" random values satisfying a Pareto distribution with given scale and shape parameters\. * float *scale* \- Scale parameter * float *shape* \- Shape parameter * int *number* \- Number of values to be returned - <a name='105'></a>__::math::statistics::random\-cauchy__ *location* *scale* *number* Return a list of "number" random values satisfying a Cauchy distribution with given location and scale parameters\. * float *location* \- Location parameter * float *scale* \- Scale parameter * int *number* \- Number of values to be returned - <a name='106'></a>__::math::statistics::random\-laplace__ *location* *scale* *number* Return a list of "number" random values satisfying a Laplace distribution with given location and shape parameters\. The Laplace distribution consists of two exponential functions, is peaked and has heavier tails than the normal distribution\. * float *location* \- Location parameter \(mean\) * float *scale* \- Shape parameter * int *number* \- Number of values to be returned - <a name='107'></a>__::math::statistics::random\-kumaraswamy__ *a* *b* *number* Return a list of "number" random values satisying a Kumaraswamy distribution with given parameters a and b\. The Kumaraswamy distribution is related to the Beta distribution, but has a tractable cumulative distribution function\. * float *a* \- Parameter a * float *b* \- Parameter b * int *number* \- Number of values to be returned - <a name='108'></a>__::math::statistics::random\-negative\-binomial__ *r* *p* *number* Return a list of "number" random values satisying a negative binomial distribution\. * int *r* \- Allowed number of failures \(at least 1\) * float *p* \- Probability of success * int *number* \- Number of values to be returned - <a name='109'></a>__::math::statistics::histogram\-uniform__ *xmin* *xmax* *limits* *number* Return the expected histogram for a uniform distribution\. * float *xmin* \- Minimum value of the distribution * float *xmax* \- Maximum value of the distribution * list *limits* \- Upper limits for the buckets in the histogram * int *number* \- Total number of "observations" in the histogram - <a name='110'></a>__::math::statistics::incompleteGamma__ *x* *p* ?tol? Evaluate the incomplete Gamma integral 1 / x p-1 P(p,x) = -------- | dt exp(-t) * t Gamma(p) / 0 * float *x* \- Value of x \(limit of the integral\) * float *p* \- Value of p in the integrand * float *tol* \- Required tolerance \(default: 1\.0e\-9\) - <a name='111'></a>__::math::statistics::incompleteBeta__ *a* *b* *x* ?tol? Evaluate the incomplete Beta integral * float *a* \- First shape parameter * float *b* \- Second shape parameter * float *x* \- Value of x \(limit of the integral\) * float *tol* \- Required tolerance \(default: 1\.0e\-9\) - <a name='112'></a>__::math::statistics::estimate\-pareto__ *values* Estimate the parameters for the Pareto distribution that comes closest to the given values\. Returns the estimated scale and shape parameters, as well as the standard error for the shape parameter\. * list *values* \- List of values, assumed to be distributed according to a Pareto distribution - <a name='113'></a>__::math::statistics::estimate\-exponential__ *values* Estimate the parameter for the exponential distribution that comes closest to the given values\. Returns an estimate of the one parameter and of the standard error\. * list *values* \- List of values, assumed to be distributed according to an exponential distribution - <a name='114'></a>__::math::statistics::estimate\-laplace__ *values* Estimate the parameters for the Laplace distribution that comes closest to the given values\. Returns an estimate of respectively the location and scale parameters, based on maximum likelihood\. * list *values* \- List of values, assumed to be distributed according to an exponential distribution - <a name='115'></a>__::math::statistics::estimante\-negative\-binomial__ *r* *values* Estimate the probability of success for the negative binomial distribution that comes closest to the given values\. The allowed number of failures must be given\. * int *r* \- Allowed number of failures \(at least 1\) * int *number* \- List of values, assumed to be distributed according to a negative binomial distribution\. TO DO: more function descriptions to be added # <a name='section5'></a>DATA MANIPULATION The data manipulation procedures act on lists or lists of lists: - <a name='116'></a>__::math::statistics::filter__ *varname* *data* *expression* Return a list consisting of the data for which the logical expression is true \(this command works analogously to the command __[foreach](\.\./\.\./\.\./\.\./index\.md\#foreach)__\)\. * string *varname* \- Name of the variable used in the expression * list *data* \- List of data * string *expression* \- Logical expression using the variable name - <a name='117'></a>__::math::statistics::map__ *varname* *data* *expression* Return a list consisting of the data that are transformed via the expression\. * string *varname* \- Name of the variable used in the expression * list *data* \- List of data * string *expression* \- Expression to be used to transform \(map\) the data - <a name='118'></a>__::math::statistics::samplescount__ *varname* *list* *expression* Return a list consisting of the *counts* of all data in the sublists of the "list" argument for which the expression is true\. * string *varname* \- Name of the variable used in the expression * list *data* \- List of sublists, each containing the data * string *expression* \- Logical expression to test the data \(defaults to "true"\)\. - <a name='119'></a>__::math::statistics::subdivide__ Routine *PM* \- not implemented yet # <a name='section6'></a>PLOT PROCEDURES The following simple plotting procedures are available: - <a name='120'></a>__::math::statistics::plot\-scale__ *canvas* *xmin* *xmax* *ymin* *ymax* Set the scale for a plot in the given canvas\. All plot routines expect this function to be called first\. There is no automatic scaling provided\. * widget *canvas* \- Canvas widget to use |
︙ | ︙ | |||
2064 2065 2066 2067 2068 2069 2070 | \- Minimum y value * float *ymax* \- Maximum y value | | | | | | | 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 | \- Minimum y value * float *ymax* \- Maximum y value - <a name='121'></a>__::math::statistics::plot\-xydata__ *canvas* *xdata* *ydata* *tag* Create a simple XY plot in the given canvas \- the data are shown as a collection of dots\. The tag can be used to manipulate the appearance\. * widget *canvas* \- Canvas widget to use * float *xdata* \- Series of independent data * float *ydata* \- Series of dependent data * string *tag* \- Tag to give to the plotted data \(defaults to xyplot\) - <a name='122'></a>__::math::statistics::plot\-xyline__ *canvas* *xdata* *ydata* *tag* Create a simple XY plot in the given canvas \- the data are shown as a line through the data points\. The tag can be used to manipulate the appearance\. * widget *canvas* \- Canvas widget to use * list *xdata* \- Series of independent data * list *ydata* \- Series of dependent data * string *tag* \- Tag to give to the plotted data \(defaults to xyplot\) - <a name='123'></a>__::math::statistics::plot\-tdata__ *canvas* *tdata* *tag* Create a simple XY plot in the given canvas \- the data are shown as a collection of dots\. The horizontal coordinate is equal to the index\. The tag can be used to manipulate the appearance\. This type of presentation is suitable for autocorrelation functions for instance or for inspecting the time\-dependent behaviour\. * widget *canvas* \- Canvas widget to use * list *tdata* \- Series of dependent data * string *tag* \- Tag to give to the plotted data \(defaults to xyplot\) - <a name='124'></a>__::math::statistics::plot\-tline__ *canvas* *tdata* *tag* Create a simple XY plot in the given canvas \- the data are shown as a line\. See plot\-tdata for an explanation\. * widget *canvas* \- Canvas widget to use * list *tdata* \- Series of dependent data * string *tag* \- Tag to give to the plotted data \(defaults to xyplot\) - <a name='125'></a>__::math::statistics::plot\-histogram__ *canvas* *counts* *limits* *tag* Create a simple histogram in the given canvas * widget *canvas* \- Canvas widget to use |
︙ | ︙ |
Changes to embedded/md/tcllib/files/modules/practcl/practcl.md.
1 2 3 4 | [//000000001]: # (practcl \- The The Proper Rational API for C to Tool Command Language Module) [//000000002]: # (Generated from file 'practcl\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2016\-2018 Sean Woods <yoda@etoyoc\.com>) | | | 1 2 3 4 5 6 7 8 9 10 11 12 | [//000000001]: # (practcl \- The The Proper Rational API for C to Tool Command Language Module) [//000000002]: # (Generated from file 'practcl\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2016\-2018 Sean Woods <yoda@etoyoc\.com>) [//000000004]: # (practcl\(n\) 0\.16\.4 tcllib "The The Proper Rational API for C to Tool Command Language Module") <hr> [ <a href="../../../../toc.md">Main Table Of Contents</a> | <a href="../../../toc.md">Table Of Contents</a> | <a href="../../../../index.md">Keyword Index</a> | <a href="../../../../toc0.md">Categories</a> | <a href="../../../../toc1.md">Modules</a> | <a href="../../../../toc2.md">Applications</a> ] <hr> |
︙ | ︙ | |||
481 482 483 484 485 486 487 488 489 490 | - <a name='16'></a>proc __practcl::sort\_dict__ *list* Dictionary sort a key/value list\. Needed because pre tcl8\.6 does not have *lsort \-stride 2* - <a name='17'></a>proc __practcl::local\_os__ - <a name='18'></a>proc __practcl::config\.tcl__ *path* | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 | - <a name='16'></a>proc __practcl::sort\_dict__ *list* Dictionary sort a key/value list\. Needed because pre tcl8\.6 does not have *lsort \-stride 2* - <a name='17'></a>proc __practcl::local\_os__ Returns a dictionary describing the local operating system\. Fields return include: * download \- Filesystem path where fossil repositories and source tarballs are downloaded for the current user * EXEEXT \- The extension to give to executables\. \(i\.e\. \.exe on windows\) * fossil\_mirror \- A URI for a local network web server who acts as a fossil repository mirror * local\_install \- Filesystem path where packages for local consumption by the current user are installed * prefix \- The prefix as given to the Tcl core/TEA for installation to local\_install in \./configure * sandbox \- The file location where this project unpacks external projects * TEACUP\_PROFILE \- The ActiveState/Teacup canonical name for this platform \(i\.e\. win32\-ix86 macosx10\.5\-i386\-x86\_84\) * TEACUP\_OS \- The local operating system \(windows, macosx, openbsd, etc\)\. Gives the same answer as tcl\.m4, except that macosx is given as macosx instead of Darwin\. * TEA\_PLATFORM \- The platform returned by uname \-s\-uname \-r \(on Unix\), or "windows" on Windows * TEACUP\_ARCH \- The processor architecture for the local os \(i\.e\. ix86, x86\_64\) * TEACUP\_ARCH \- The processor architecture for the local os \(i\.e\. ix86, x86\_64\) * teapot \- Filesystem path where teapot package files are downloaded for the current user * userhome \- File path to store localized preferences, cache download files, etc for the current user This command uses a combination of local checks with Exec, any tclConfig\.sh file that is resident, autoconf data where already computed, and data gleaned from a file named practcl\.rc in userhome\. The location for userhome varies by platform and operating system: * Windows: ::env\(LOCALAPPDATA\)/Tcl * Macos: ~/Library/Application Support/Tcl * Other: ~/tcl - <a name='18'></a>proc __practcl::config\.tcl__ *path* A transparent call to ::practcl::read\_configuration to preserve backward compadibility with older copies of Practcl - <a name='19'></a>proc __practcl::read\_configuration__ *path* Detect local platform\. This command looks for data gleaned by autoconf or autosetup in the path specified, or perform its own logic tests if neither has been run\. A file named config\.site present in the location indicates that this project is cross compiling, and the data stored in that file is used for the compiler and linker\. This command looks for information from the following files, in the following order: * config\.tcl \- A file generated by autoconf/configure in newer editions of TEA, encoded as a Tcl script\. * config\.site \- A file containing cross compiler information, encoded as a SH script * ::env\(VisualStudioVersion\) \- On Windows, and environmental value that indicates MS Visual Studio is installed This command returns a dictionary containing all of the data cleaned from the sources above\. In the absence of any guidance this command returns the same output as ::practcl::local\_os\. In this mode, if the environmental variable VisualStudioVersion exists, this command will provide a template of fields that are appropriate for compiling on Windows under Microsoft Visual Studio\. The USEMSVC flag in the dictionary is a boolean flag to indicate if this is indeed the case\. - <a name='20'></a>proc __practcl::tcllib\_require__ *pkg* ?*args*? Try to load a package, and failing that retrieve tcllib - <a name='21'></a>proc __practcl::platform::tcl\_core\_options__ *os* Return the string to pass to \./configure to compile the Tcl core for the given OS\. * windows: \-\-with\-tzdata \-\-with\-encoding utf\-8 * macosx: \-\-enable\-corefoundation=yes \-\-enable\-framework=no \-\-with\-tzdata \-\-with\-encoding utf\-8 * other: \-\-with\-tzdata \-\-with\-encoding utf\-8 - <a name='22'></a>proc __practcl::platform::tk\_core\_options__ *os* - <a name='23'></a>proc __practcl::read\_rc\_file__ *filename* ?*localdat* ____? Read a stylized key/value list stored in a file |
︙ | ︙ | |||
576 577 578 579 580 581 582 583 584 585 586 587 588 589 | - <a name='42'></a>proc __practcl::copyDir__ *d1* *d2* ?*toplevel* __1__? Recursively copy the contents of *d1* to *d2* - <a name='43'></a>proc __practcl::buildModule__ *modpath* - <a name='44'></a>proc __practcl::installModule__ *modpath* *DEST* - <a name='45'></a>proc __practcl::trigger__ ?*args*? Trigger build targets, and recompute dependencies Internals: | > > > > > > > > > > > > > > | 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 | - <a name='42'></a>proc __practcl::copyDir__ *d1* *d2* ?*toplevel* __1__? Recursively copy the contents of *d1* to *d2* - <a name='43'></a>proc __practcl::buildModule__ *modpath* - <a name='44'></a>proc __practcl::installModule__ *modpath* *DEST* Install a module from MODPATH to the directory specified\. *dpath* is assumed to be the fully qualified path where module is to be placed\. Any existing files will be deleted at that path\. If the path is symlink the process will return with no error and no action\. If the module has contents in the build/ directory that are newer than the \.tcl files in the module source directory, and a build/build\.tcl file exists, the build/build\.tcl file is run\. If the source directory includes a file named index\.tcl, the directory is assumed to be in the tao style of modules, and the entire directory \(and all subdirectories\) are copied verbatim\. If no index\.tcl file is present, all \.tcl files are copied from the module source directory, and a pkgIndex\.tcl file is generated if non yet exists\. I a folder named htdocs exists in the source directory, that directory is copied verbatim to the destination\. - <a name='45'></a>proc __practcl::trigger__ ?*args*? Trigger build targets, and recompute dependencies Internals: |
︙ | ︙ |
Changes to embedded/md/tcllib/files/modules/profiler/profiler.md.
1 2 3 | [//000000001]: # (profiler \- Tcl Profiler) [//000000002]: # (Generated from file 'profiler\.man' by tcllib/doctools with format 'markdown') | | | 1 2 3 4 5 6 7 8 9 10 11 | [//000000001]: # (profiler \- Tcl Profiler) [//000000002]: # (Generated from file 'profiler\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (profiler\(n\) 0\.5 tcllib "Tcl Profiler") <hr> [ <a href="../../../../toc.md">Main Table Of Contents</a> | <a href="../../../toc.md">Table Of Contents</a> | <a href="../../../../index.md">Keyword Index</a> | <a href="../../../../toc0.md">Categories</a> | <a href="../../../../toc1.md">Modules</a> | <a href="../../../../toc2.md">Applications</a> ] <hr> |
︙ | ︙ | |||
29 30 31 32 33 34 35 | - [Keywords](#keywords) - [Category](#category) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.3 | | > > | | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | - [Keywords](#keywords) - [Category](#category) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.3 package require profiler ?0\.5? [__::profiler::init__](#1) [__::profiler::dump__ *pattern*](#2) [__::profiler::print__ ?*pattern*?](#3) [__::profiler::reset__ ?*pattern*?](#4) [__::profiler::suspend__ ?*pattern*?](#5) [__::profiler::resume__ ?*pattern*?](#6) [__::profiler::new\-disabled__](#7) [__::profiler::new\-enabled__](#8) [__::profiler::sortFunctions__ *key*](#9) # <a name='description'></a>DESCRIPTION The __profiler__ package provides a simple Tcl source code profiler\. It is a function\-level profiler; that is, it collects only function\-level information, not the more detailed line\-level information\. It operates by redefining the Tcl __[proc](\.\./\.\./\.\./\.\./index\.md\#proc)__ command\. Profiling is initiated |
︙ | ︙ | |||
118 119 120 121 122 123 124 | - <a name='6'></a>__::profiler::resume__ ?*pattern*? Resume profiling for all functions matching *pattern*\. If no pattern is specified, profiling will be resumed for all functions\. This command should be invoked after suspending the profiler in the code\. | | > > > > > > > > > > > > > > | 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | - <a name='6'></a>__::profiler::resume__ ?*pattern*? Resume profiling for all functions matching *pattern*\. If no pattern is specified, profiling will be resumed for all functions\. This command should be invoked after suspending the profiler in the code\. - <a name='7'></a>__::profiler::new\-disabled__ Change the initial profiling state for new procedures\. Invoking this command disables profiling for all procedures created after this command until __new\-enabled__ is invoked\. Activate profiling of specific procedures via __resume__\. - <a name='8'></a>__::profiler::new\-enabled__ Change the initial profiling state for new procedures\. Invoking this command enables profiling for all procedures created after this command until __new\-disabled__ is invoked\. Prevent profiling of specific procedures via __suspend__\. - <a name='9'></a>__::profiler::sortFunctions__ *key* Return a list of functions sorted by a particular profiling statistic\. Supported values for *key* are: __calls__, __exclusiveTime__, __compileTime__, __nonCompileTime__, __totalRuntime__, __avgExclusiveTime__, and __avgRuntime__\. The return result is a list of lists, where each sublist consists of a function name and the value of *key* for that function\. |
︙ | ︙ |
Changes to embedded/md/tcllib/files/modules/struct/matrix.md.
1 2 3 | [//000000001]: # (struct::matrix \- Tcl Data Structures) [//000000002]: # (Generated from file 'matrix\.man' by tcllib/doctools with format 'markdown') | | | | 1 2 3 4 5 6 7 8 9 10 11 12 | [//000000001]: # (struct::matrix \- Tcl Data Structures) [//000000002]: # (Generated from file 'matrix\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2002\-2013,2019 Andreas Kupries <andreas\_kupries@users\.sourceforge\.net>) [//000000004]: # (struct::matrix\(n\) 2\.0\.4 tcllib "Tcl Data Structures") <hr> [ <a href="../../../../toc.md">Main Table Of Contents</a> | <a href="../../../toc.md">Table Of Contents</a> | <a href="../../../../index.md">Keyword Index</a> | <a href="../../../../toc0.md">Categories</a> | <a href="../../../../toc1.md">Modules</a> | <a href="../../../../toc2.md">Applications</a> ] <hr> |
︙ | ︙ | |||
32 33 34 35 36 37 38 | - [Category](#category) - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.2 | | | 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | - [Category](#category) - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.2 package require struct::matrix ?2\.0\.4? [__::struct::matrix__ ?*matrixName*? ?__=__|__:=__|__as__|__deserialize__ *source*?](#1) [__matrixName__ *option* ?*arg arg \.\.\.*?](#2) [*matrixName* __=__ *sourcematrix*](#3) [*matrixName* __\-\->__ *destmatrix*](#4) [*matrixName* __add column__ ?*values*?](#5) [*matrixName* __add row__ ?*values*?](#6) |
︙ | ︙ | |||
529 530 531 532 533 534 535 | # <a name='category'></a>CATEGORY Data structures # <a name='copyright'></a>COPYRIGHT | | | 529 530 531 532 533 534 535 536 | # <a name='category'></a>CATEGORY Data structures # <a name='copyright'></a>COPYRIGHT Copyright © 2002\-2013,2019 Andreas Kupries <andreas\_kupries@users\.sourceforge\.net> |
Changes to embedded/md/tcllib/files/modules/struct/matrix1.md.
1 2 3 | [//000000001]: # (struct::matrix\_v1 \- Tcl Data Structures) [//000000002]: # (Generated from file 'matrix1\.man' by tcllib/doctools with format 'markdown') | | | | 1 2 3 4 5 6 7 8 9 10 11 12 | [//000000001]: # (struct::matrix\_v1 \- Tcl Data Structures) [//000000002]: # (Generated from file 'matrix1\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2002,2019 Andreas Kupries <andreas\_kupries@users\.sourceforge\.net>) [//000000004]: # (struct::matrix\_v1\(n\) 1\.2\.2 tcllib "Tcl Data Structures") <hr> [ <a href="../../../../toc.md">Main Table Of Contents</a> | <a href="../../../toc.md">Table Of Contents</a> | <a href="../../../../index.md">Keyword Index</a> | <a href="../../../../toc0.md">Categories</a> | <a href="../../../../toc1.md">Modules</a> | <a href="../../../../toc2.md">Applications</a> ] <hr> |
︙ | ︙ | |||
32 33 34 35 36 37 38 | - [Category](#category) - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.2 | | | 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | - [Category](#category) - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.2 package require struct::matrix ?1\.2\.2? [__matrixName__ *option* ?*arg arg \.\.\.*?](#1) [*matrixName* __add column__ ?*values*?](#2) [*matrixName* __add row__ ?*values*?](#3) [*matrixName* __add columns__ *n*](#4) [*matrixName* __add rows__ *n*](#5) [*matrixName* __cells__](#6) |
︙ | ︙ | |||
410 411 412 413 414 415 416 | # <a name='category'></a>CATEGORY Data structures # <a name='copyright'></a>COPYRIGHT | | | 410 411 412 413 414 415 416 417 | # <a name='category'></a>CATEGORY Data structures # <a name='copyright'></a>COPYRIGHT Copyright © 2002,2019 Andreas Kupries <andreas\_kupries@users\.sourceforge\.net> |
Changes to embedded/md/tcllib/files/modules/virtchannel_base/halfpipe.md.
1 2 3 | [//000000001]: # (tcl::chan::halfpipe \- Reflected/virtual channel support) [//000000002]: # (Generated from file 'halfpipe\.man' by tcllib/doctools with format 'markdown') | | | | 1 2 3 4 5 6 7 8 9 10 11 12 | [//000000001]: # (tcl::chan::halfpipe \- Reflected/virtual channel support) [//000000002]: # (Generated from file 'halfpipe\.man' by tcllib/doctools with format 'markdown') [//000000003]: # (Copyright © 2009, 2019 Andreas Kupries <andreas\_kupries@users\.sourceforge\.net>) [//000000004]: # (tcl::chan::halfpipe\(n\) 1\.0\.1 tcllib "Reflected/virtual channel support") <hr> [ <a href="../../../../toc.md">Main Table Of Contents</a> | <a href="../../../toc.md">Table Of Contents</a> | <a href="../../../../index.md">Keyword Index</a> | <a href="../../../../toc0.md">Categories</a> | <a href="../../../../toc1.md">Modules</a> | <a href="../../../../toc2.md">Applications</a> ] <hr> |
︙ | ︙ | |||
36 37 38 39 40 41 42 | - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.5 package require TclOO package require tcl::chan::events ?1? | | < | 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | - [Copyright](#copyright) # <a name='synopsis'></a>SYNOPSIS package require Tcl 8\.5 package require TclOO package require tcl::chan::events ?1? package require tcl::chan::halfpipe ?1\.0\.1? [__::tcl::chan::halfpipe__ ?__\-option__ *value*\.\.\.?](#1) [*objectCmd* __put__ *bytes*](#2) # <a name='description'></a>DESCRIPTION The __tcl::chan::halfpipe__ package provides a command creating one half of |
︙ | ︙ | |||
122 123 124 125 126 127 128 | # <a name='category'></a>CATEGORY Channels # <a name='copyright'></a>COPYRIGHT | | | 121 122 123 124 125 126 127 128 | # <a name='category'></a>CATEGORY Channels # <a name='copyright'></a>COPYRIGHT Copyright © 2009, 2019 Andreas Kupries <andreas\_kupries@users\.sourceforge\.net> |
Changes to idoc/man/files/modules/blowfish/blowfish.n.
1 2 3 4 | '\" '\" Generated from file 'blowfish\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2003, Pat Thoyts <patthoyts@users\&.sourceforge\&.net> '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 | '\" '\" Generated from file 'blowfish\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2003, Pat Thoyts <patthoyts@users\&.sourceforge\&.net> '\" .TH "blowfish" n 1\&.0\&.5 tcllib "Blowfish Block Cipher" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, |
︙ | ︙ | |||
272 273 274 275 276 277 278 | .. .BS .SH NAME blowfish \- Implementation of the Blowfish block cipher .SH SYNOPSIS package require \fBTcl 8\&.4\fR .sp | | | 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 | .. .BS .SH NAME blowfish \- Implementation of the Blowfish block cipher .SH SYNOPSIS package require \fBTcl 8\&.4\fR .sp package require \fBblowfish ?1\&.0\&.5?\fR .sp \fB::blowfish::blowfish\fR ?\fI-mode [ecb|cbc]\fR? ?\fI-dir [encrypt|decrypt]\fR? \fI-key keydata\fR ?\fI-iv vector\fR? ?\fI-out channel\fR? ?\fI-chunksize size\fR? ?\fI-pad padchar\fR? [ \fI-in channel\fR | ?\fI--\fR? \fIdata\fR ] .sp \fB::blowfish::Init\fR \fImode\fR \fIkeydata\fR \fIiv\fR .sp \fB::blowfish::Encrypt\fR \fIKey\fR \fIdata\fR .sp |
︙ | ︙ |
Changes to idoc/man/files/modules/clay/clay.n.
1 2 3 4 | '\" '\" Generated from file 'clay\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2018 Sean Woods <yoda@etoyoc\&.com> '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 | '\" '\" Generated from file 'clay\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2018 Sean Woods <yoda@etoyoc\&.com> '\" .TH "clay" n 0\&.8\&.6 tcllib "Clay Framework" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, |
︙ | ︙ | |||
300 301 302 303 304 305 306 307 308 309 310 311 312 313 | .sp proc \fBclay::leaf\fR ?\fIargs\fR? .sp proc \fBclay::K\fR \fIa\fR \fIb\fR .sp proc \fBclay::noop\fR ?\fIargs\fR? .sp proc \fBclay::path\fR ?\fIargs\fR? .sp proc \fBclay::putb\fR ?\fImap\fR? \fItext\fR .sp proc \fBclay::script_path\fR .sp proc \fBclay::NSNormalize\fR \fIqualname\fR | > > > > > > > > | 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 | .sp proc \fBclay::leaf\fR ?\fIargs\fR? .sp proc \fBclay::K\fR \fIa\fR \fIb\fR .sp proc \fBclay::noop\fR ?\fIargs\fR? .sp proc \fBclay::cleanup\fR .sp proc \fBclay::object_create\fR \fIobjname\fR ?\fIclass\fR \fB\fR? .sp proc \fBclay::object_rename\fR \fIobject\fR \fInewname\fR .sp proc \fBclay::object_destroy\fR ?\fIargs\fR? .sp proc \fBclay::path\fR ?\fIargs\fR? .sp proc \fBclay::putb\fR ?\fImap\fR? \fItext\fR .sp proc \fBclay::script_path\fR .sp proc \fBclay::NSNormalize\fR \fIqualname\fR |
︙ | ︙ | |||
388 389 390 391 392 393 394 | .sp proc \fBclay::define::Variable\fR \fIname\fR ?\fIdefault\fR \fB\fR? .sp proc \fBclay::ensemble_methodbody\fR \fIensemble\fR \fIeinfo\fR .sp proc \fBclay::define::Ensemble\fR \fIrawmethod\fR ?\fIargs\fR? .sp | < < < < < < < < > > > > | 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 | .sp proc \fBclay::define::Variable\fR \fIname\fR ?\fIdefault\fR \fB\fR? .sp proc \fBclay::ensemble_methodbody\fR \fIensemble\fR \fIeinfo\fR .sp proc \fBclay::define::Ensemble\fR \fIrawmethod\fR ?\fIargs\fR? .sp proc \fBclay::event::cancel\fR \fIself\fR ?\fItask\fR \fB*\fR? .sp proc \fBclay::event::generate\fR \fIself\fR \fIevent\fR ?\fIargs\fR? .sp proc \fBclay::event::nextid\fR .sp proc \fBclay::event::Notification_list\fR \fIself\fR \fIevent\fR ?\fIstackvar\fR \fB\fR? .sp proc \fBclay::event::notify\fR \fIrcpt\fR \fIsender\fR \fIevent\fR \fIeventinfo\fR .sp proc \fBclay::event::process\fR \fIself\fR \fIhandle\fR \fIscript\fR .sp proc \fBclay::event::schedule\fR \fIself\fR \fIhandle\fR \fIinterval\fR \fIscript\fR .sp proc \fBclay::event::subscribe\fR \fIself\fR \fIwho\fR \fIevent\fR .sp proc \fBclay::event::unsubscribe\fR \fIself\fR ?\fIargs\fR? .sp proc \fBclay::singleton\fR \fIname\fR \fIscript\fR .sp method \fBclay ancestors\fR .sp method \fBclay dump\fR .sp method \fBclay find\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? .sp method \fBclay get\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? .sp method \fBclay GET\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? .sp method \fBclay merge\fR \fIdict\fR ?\fBdict\&.\&.\&.\fR? .sp method \fBclay replace\fR \fIdictionary\fR .sp method \fBclay search\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? .sp method \fBclay set\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? \fIvalue\fR .sp method \fBclay ancestors\fR .sp method \fBclay cache\fR \fIpath\fR \fIvalue\fR .sp method \fBclay cget\fR \fIfield\fR .sp method \fBclay delegate\fR ?\fIstub\fR? ?\fIobject\fR? .sp method \fBclay dump\fR .sp |
︙ | ︙ | |||
465 466 467 468 469 470 471 472 473 474 475 476 477 478 | method \fBclay mixin\fR \fIclass\fR ?\fBclass\&.\&.\&.\fR? .sp method \fBclay mixinmap\fR ?\fIstub\fR? ?\fIclasses\fR? .sp method \fBclay provenance\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? .sp method \fBclay replace\fR \fIdictionary\fR .sp method \fBclay source\fR \fIfilename\fR .sp method \fBclay set\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? \fIvalue\fR .sp method \fBInitializePublic\fR .sp | > > | 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 | method \fBclay mixin\fR \fIclass\fR ?\fBclass\&.\&.\&.\fR? .sp method \fBclay mixinmap\fR ?\fIstub\fR? ?\fIclasses\fR? .sp method \fBclay provenance\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? .sp method \fBclay replace\fR \fIdictionary\fR .sp method \fBclay search\fR \fIpath\fR \fIvaluevar\fR \fIisleafvar\fR .sp method \fBclay source\fR \fIfilename\fR .sp method \fBclay set\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? \fIvalue\fR .sp method \fBInitializePublic\fR .sp |
︙ | ︙ | |||
623 624 625 626 627 628 629 630 631 632 633 634 635 636 | .TP proc \fBclay::noop\fR ?\fIargs\fR? Perform a noop\&. Useful in prototyping for commenting out blocks of code without actually having to comment them out\&. It also makes a handy default for method delegation if a delegate has not been assigned yet\&. .TP proc \fBclay::path\fR ?\fIargs\fR? .TP proc \fBclay::putb\fR ?\fImap\fR? \fItext\fR Append a line of text to a variable\&. Optionally apply a string mapping\&. .TP proc \fBclay::script_path\fR .TP | > > > > > > > > > > | 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 | .TP proc \fBclay::noop\fR ?\fIargs\fR? Perform a noop\&. Useful in prototyping for commenting out blocks of code without actually having to comment them out\&. It also makes a handy default for method delegation if a delegate has not been assigned yet\&. .TP proc \fBclay::cleanup\fR Process the queue of objects to be destroyed .TP proc \fBclay::object_create\fR \fIobjname\fR ?\fIclass\fR \fB\fR? .TP proc \fBclay::object_rename\fR \fIobject\fR \fInewname\fR .TP proc \fBclay::object_destroy\fR ?\fIargs\fR? Mark an objects for destruction on the next cleanup .TP proc \fBclay::path\fR ?\fIargs\fR? .TP proc \fBclay::putb\fR ?\fImap\fR? \fItext\fR Append a line of text to a variable\&. Optionally apply a string mapping\&. .TP proc \fBclay::script_path\fR .TP |
︙ | ︙ | |||
827 828 829 830 831 832 833 | property variable NAME {default DEFAULT} .CE .sp Variables registered in the variable property are also initialized (if missing) when the object changes class via the \fImorph\fR method\&. .TP proc \fBclay::ensemble_methodbody\fR \fIensemble\fR \fIeinfo\fR | > > > > | < > | | > > > > > > | | | | < | < | 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 | property variable NAME {default DEFAULT} .CE .sp Variables registered in the variable property are also initialized (if missing) when the object changes class via the \fImorph\fR method\&. .TP proc \fBclay::ensemble_methodbody\fR \fIensemble\fR \fIeinfo\fR Produce the body of an ensemble's public dispatch method ensemble is the name of the the ensemble\&. einfo is a dictionary of methods for the ensemble, and each value is a script to execute on dispatch .sp Example: .CS ::clay::ensemble_methodbody foo { bar {tailcall my Foo_bar {*}$args} baz {tailcall my Foo_baz {*}$args} clock {return [clock seconds]} default {puts "You gave me $method"} } .CE .TP proc \fBclay::define::Ensemble\fR \fIrawmethod\fR ?\fIargs\fR? .TP proc \fBclay::event::cancel\fR \fIself\fR ?\fItask\fR \fB*\fR? Cancel a scheduled event .TP proc \fBclay::event::generate\fR \fIself\fR \fIevent\fR ?\fIargs\fR? Generate an event Adds a subscription mechanism for objects to see who has recieved this event and prevent |
︙ | ︙ | |||
869 870 871 872 873 874 875 876 877 878 879 880 881 882 | Schedule an event to occur later .TP proc \fBclay::event::subscribe\fR \fIself\fR \fIwho\fR \fIevent\fR Subscribe an object to an event pattern .TP proc \fBclay::event::unsubscribe\fR \fIself\fR ?\fIargs\fR? Unsubscribe an object from an event pattern .PP .SH CLASSES .SS "CLASS CLAY::CLASS" .PP \fBMethods\fR .TP method \fBclay ancestors\fR | > > > | 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 | Schedule an event to occur later .TP proc \fBclay::event::subscribe\fR \fIself\fR \fIwho\fR \fIevent\fR Subscribe an object to an event pattern .TP proc \fBclay::event::unsubscribe\fR \fIself\fR ?\fIargs\fR? Unsubscribe an object from an event pattern .TP proc \fBclay::singleton\fR \fIname\fR \fIscript\fR An object which is intended to be it's own class\&. .PP .SH CLASSES .SS "CLASS CLAY::CLASS" .PP \fBMethods\fR .TP method \fBclay ancestors\fR |
︙ | ︙ | |||
920 921 922 923 924 925 926 927 928 929 930 931 932 933 | This class is inherited by all classes that have options\&. .PP \fBMethods\fR .TP method \fBclay ancestors\fR Return the class this object belongs to, all classes mixed into this object, and all ancestors of those classes in search order\&. .TP method \fBclay cget\fR \fIfield\fR Pull a value from either the object's clay structure or one of its constituent classes that matches the field name\&. The order of search us: .sp 1\&. The as a value in local dict variable config .sp 2\&. The as a value in local dict variable clay | > > > | 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 | This class is inherited by all classes that have options\&. .PP \fBMethods\fR .TP method \fBclay ancestors\fR Return the class this object belongs to, all classes mixed into this object, and all ancestors of those classes in search order\&. .TP method \fBclay cache\fR \fIpath\fR \fIvalue\fR Store VALUE in such a way that request in SEARCH for PATH will always return it until the cache is flushed .TP method \fBclay cget\fR \fIfield\fR Pull a value from either the object's clay structure or one of its constituent classes that matches the field name\&. The order of search us: .sp 1\&. The as a value in local dict variable config .sp 2\&. The as a value in local dict variable clay |
︙ | ︙ | |||
995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 | .TP method \fBclay provenance\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? Return either \fBself\fR if that path exists in the current object, or return the first class (if any) along the clay search path which contains that element\&. .TP method \fBclay replace\fR \fIdictionary\fR Replace the contents of the internal clay storage with the dictionary given\&. .TP method \fBclay source\fR \fIfilename\fR Source the given filename within the object's namespace .TP method \fBclay set\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? \fIvalue\fR Merge the conents of \fBvalue\fR with the object's clay storage at \fBpath\fR\&. .TP method \fBInitializePublic\fR | > > > | 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 | .TP method \fBclay provenance\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? Return either \fBself\fR if that path exists in the current object, or return the first class (if any) along the clay search path which contains that element\&. .TP method \fBclay replace\fR \fIdictionary\fR Replace the contents of the internal clay storage with the dictionary given\&. .TP method \fBclay search\fR \fIpath\fR \fIvaluevar\fR \fIisleafvar\fR Return true, and set valuevar to the value and isleafar to true for false if PATH was found in the cache\&. .TP method \fBclay source\fR \fIfilename\fR Source the given filename within the object's namespace .TP method \fBclay set\fR \fIpath\fR ?\fBpath\&.\&.\&.\fR? \fIvalue\fR Merge the conents of \fBvalue\fR with the object's clay storage at \fBpath\fR\&. .TP method \fBInitializePublic\fR |
︙ | ︙ |
Changes to idoc/man/files/modules/debug/debug_heartbeat.n.
1 2 3 4 5 | '\" '\" Generated from file 'debug_heartbeat\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 200?, Colin McCormack, Wub Server Utilities '\" Copyright (c) 2012, Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net> '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | '\" '\" Generated from file 'debug_heartbeat\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 200?, Colin McCormack, Wub Server Utilities '\" Copyright (c) 2012, Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net> '\" .TH "debug::heartbeat" n 1\&.0\&.1 tcllib "debug narrative" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, |
︙ | ︙ | |||
273 274 275 276 277 278 279 | .. .BS .SH NAME debug::heartbeat \- debug narrative - heartbeat .SH SYNOPSIS package require \fBTcl 8\&.5\fR .sp | | | 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 | .. .BS .SH NAME debug::heartbeat \- debug narrative - heartbeat .SH SYNOPSIS package require \fBTcl 8\&.5\fR .sp package require \fBdebug::heartbeat ?1\&.0\&.1?\fR .sp package require \fBdebug ?1?\fR .sp \fBdebug\fR \fBheartbeat\fR ?\fIdelta\fR? .sp .BE .SH DESCRIPTION |
︙ | ︙ |
Changes to idoc/man/files/modules/dns/tcllib_dns.n.
1 2 3 4 | '\" '\" Generated from file 'tcllib_dns\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2002, Pat Thoyts '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 | '\" '\" Generated from file 'tcllib_dns\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2002, Pat Thoyts '\" .TH "dns" n 1\&.4\&.1 tcllib "Domain Name Service" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, |
︙ | ︙ | |||
272 273 274 275 276 277 278 | .. .BS .SH NAME dns \- Tcl Domain Name Service Client .SH SYNOPSIS package require \fBTcl 8\&.2\fR .sp | | | 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 | .. .BS .SH NAME dns \- Tcl Domain Name Service Client .SH SYNOPSIS package require \fBTcl 8\&.2\fR .sp package require \fBdns ?1\&.4\&.1?\fR .sp \fB::dns::resolve\fR \fIquery\fR ?\fIoptions\fR? .sp \fB::dns::configure\fR ?\fIoptions\fR? .sp \fB::dns::name\fR \fItoken\fR .sp |
︙ | ︙ |
Changes to idoc/man/files/modules/httpd/httpd.n.
1 2 3 4 | '\" '\" Generated from file 'httpd\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2018 Sean Woods <yoda@etoyoc\&.com> '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 | '\" '\" Generated from file 'httpd\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2018 Sean Woods <yoda@etoyoc\&.com> '\" .TH "httpd" n 4\&.3\&.4 tcllib "Tcl Web Server" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, |
︙ | ︙ |
Changes to idoc/man/files/modules/markdown/markdown.n.
1 2 3 | '\" '\" Generated from file 'markdown\&.man' by tcllib/doctools with format 'nroff' '\" | | | 1 2 3 4 5 6 7 8 9 10 11 | '\" '\" Generated from file 'markdown\&.man' by tcllib/doctools with format 'nroff' '\" .TH "markdown" n 1\&.1\&.1 tcllib "Markdown to HTML Converter" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, |
︙ | ︙ | |||
271 272 273 274 275 276 277 | .. .BS .SH NAME markdown \- Converts Markdown text to HTML .SH SYNOPSIS package require \fBTcl 8\&.5\fR .sp | | | 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 | .. .BS .SH NAME markdown \- Converts Markdown text to HTML .SH SYNOPSIS package require \fBTcl 8\&.5\fR .sp package require \fBMarkdown 1\&.1\&.1\fR .sp package require \fBtextutil ?0\&.8?\fR .sp \fB::Markdown::convert\fR \fImarkdown\fR .sp \fB::Markdown::register\fR \fIlangspec\fR \fIconverter\fR .sp |
︙ | ︙ |
Changes to idoc/man/files/modules/math/math_geometry.n.
︙ | ︙ | |||
305 306 307 308 309 310 311 312 313 314 315 316 317 318 | .sp \fB::math::geometry::rect\fR \fInw\fR \fIse\fR .sp \fB::math::geometry::nwse\fR \fIrect\fR .sp \fB::math::geometry::angle\fR \fIline\fR .sp \fB::math::geometry::calculateDistanceToLine\fR \fIP\fR \fIline\fR .sp \fB::math::geometry::calculateDistanceToLineSegment\fR \fIP\fR \fIlinesegment\fR .sp \fB::math::geometry::calculateDistanceToPolyline\fR \fIP\fR \fIpolyline\fR .sp \fB::math::geometry::calculateDistanceToPolygon\fR \fIP\fR \fIpolygon\fR | > > > > > > | 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 | .sp \fB::math::geometry::rect\fR \fInw\fR \fIse\fR .sp \fB::math::geometry::nwse\fR \fIrect\fR .sp \fB::math::geometry::angle\fR \fIline\fR .sp \fB::math::geometry::angleBetween\fR \fIvector1\fR \fIvector2\fR .sp \fB::math::geometry::inproduct\fR \fIvector1\fR \fIvector2\fR .sp \fB::math::geometry::areaParallellogram\fR \fIvector1\fR \fIvector2\fR .sp \fB::math::geometry::calculateDistanceToLine\fR \fIP\fR \fIline\fR .sp \fB::math::geometry::calculateDistanceToLineSegment\fR \fIP\fR \fIlinesegment\fR .sp \fB::math::geometry::calculateDistanceToPolyline\fR \fIP\fR \fIpolyline\fR .sp \fB::math::geometry::calculateDistanceToPolygon\fR \fIP\fR \fIpolygon\fR |
︙ | ︙ | |||
509 510 511 512 513 514 515 516 517 518 519 520 521 522 | Calculate the angle from the positive x-axis to a given line (in two dimensions only)\&. .RS .TP list \fIline\fR Coordinates of the line .RE .sp .TP \fB::math::geometry::calculateDistanceToLine\fR \fIP\fR \fIline\fR Calculate the distance of point P to the (infinite) line and return the result .RS .TP | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 | Calculate the angle from the positive x-axis to a given line (in two dimensions only)\&. .RS .TP list \fIline\fR Coordinates of the line .RE .TP \fB::math::geometry::angleBetween\fR \fIvector1\fR \fIvector2\fR Calculate the angle between two vectors (in degrees) .RS .TP list \fIvector1\fR First vector .TP list \fIvector2\fR Second vector .RE .TP \fB::math::geometry::inproduct\fR \fIvector1\fR \fIvector2\fR Calculate the inner product of two vectors .RS .TP list \fIvector1\fR First vector .TP list \fIvector2\fR Second vector .RE .TP \fB::math::geometry::areaParallellogram\fR \fIvector1\fR \fIvector2\fR Calculate the area of the parallellogram with the two vectors as its sides .RS .TP list \fIvector1\fR First vector .TP list \fIvector2\fR Second vector .RE .sp .TP \fB::math::geometry::calculateDistanceToLine\fR \fIP\fR \fIline\fR Calculate the distance of point P to the (infinite) line and return the result .RS .TP |
︙ | ︙ | |||
828 829 830 831 832 833 834 | Translate a polyline over a given vector .RS .TP list \fIvector\fR Translation vector .TP list \fIpolyline\fR | | | | 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 | Translate a polyline over a given vector .RS .TP list \fIvector\fR Translation vector .TP list \fIpolyline\fR The polyline to be translated .RE .sp .TP \fB::math::geometry::rotate\fR \fIangle\fR \fIpolyline\fR Rotate a polyline over a given angle (degrees) around the origin .RS .TP list \fIangle\fR Angle over which to rotate the polyline (degrees) .TP list \fIpolyline\fR The polyline to be rotated .RE .sp .TP \fB::math::geometry::reflect\fR \fIangle\fR \fIpolyline\fR Reflect a polyline in a line through the origin at a given angle (degrees) to the x-axis .RS .TP |
︙ | ︙ |
Changes to idoc/man/files/modules/math/special.n.
1 2 3 4 | '\" '\" Generated from file 'special\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2004 Arjen Markus <arjenmarkus@users\&.sourceforge\&.net> '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 | '\" '\" Generated from file 'special\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2004 Arjen Markus <arjenmarkus@users\&.sourceforge\&.net> '\" .TH "math::special" n 0\&.4 tcllib "Tcl Math Library" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, |
︙ | ︙ | |||
270 271 272 273 274 275 276 | .de MT .QW "" .. .BS .SH NAME math::special \- Special mathematical functions .SH SYNOPSIS | | | > > > > > > | 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 | .de MT .QW "" .. .BS .SH NAME math::special \- Special mathematical functions .SH SYNOPSIS package require \fBTcl ?8\&.5?\fR .sp package require \fBmath::special ?0\&.4?\fR .sp \fB::math::special::Beta\fR \fIx\fR \fIy\fR .sp \fB::math::special::incBeta\fR \fIa\fR \fIb\fR \fIx\fR .sp \fB::math::special::regIncBeta\fR \fIa\fR \fIb\fR \fIx\fR .sp \fB::math::special::Gamma\fR \fIx\fR .sp \fB::math::special::digamma\fR \fIx\fR .sp \fB::math::special::erf\fR \fIx\fR .sp \fB::math::special::erfc\fR \fIx\fR .sp \fB::math::special::invnorm\fR \fIp\fR .sp |
︙ | ︙ | |||
408 409 410 411 412 413 414 415 416 417 418 419 420 421 | | | | | Fresnel | C | all of R | -- | < 2\&.0e-3 integrals | S | all of R | -- | < 2\&.0e-3 | | | | general | Beta | (see Gamma) | -- | < 1\&.0e-9 | Gamma | x != 0,-1, | -- | < 1\&.0e-9 | | -2, \&.\&.\&. | | | sinc | all of R | -- | exact | | | | orthogonal | Legendre | all of R | n = 0,1,\&.\&.\&. | exact polynomials | Chebyshev | all of R | n = 0,1,\&.\&.\&. | exact | Laguerre | all of R | n = 0,1,\&.\&.\&. | exact | | | alpha el\&. R | | Hermite | all of R | n = 0,1,\&.\&.\&. | exact | > > > > > | 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 | | | | | Fresnel | C | all of R | -- | < 2\&.0e-3 integrals | S | all of R | -- | < 2\&.0e-3 | | | | general | Beta | (see Gamma) | -- | < 1\&.0e-9 | Gamma | x != 0,-1, | -- | < 1\&.0e-9 | | -2, \&.\&.\&. | | | incBeta | | a, b > 0 | < 1\&.0e-9 | regIncBeta | | a, b > 0 | < 1\&.0e-9 | digamma | x != 0,-1 | | < 1\&.0e-9 | | -2, \&.\&.\&. | | | | | | | sinc | all of R | -- | exact | | | | orthogonal | Legendre | all of R | n = 0,1,\&.\&.\&. | exact polynomials | Chebyshev | all of R | n = 0,1,\&.\&.\&. | exact | Laguerre | all of R | n = 0,1,\&.\&.\&. | exact | | | alpha el\&. R | | Hermite | all of R | n = 0,1,\&.\&.\&. | exact |
︙ | ︙ | |||
430 431 432 433 434 435 436 | .IP \(bu Bessel functions of the second kind (Y_n, K_n) .IP \(bu Bessel functions of arbitrary order (and hence the Airy functions) .IP \(bu Chebyshev polynomials of the second kind (U_n) .IP \(bu | < < | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 | .IP \(bu Bessel functions of the second kind (Y_n, K_n) .IP \(bu Bessel functions of arbitrary order (and hence the Airy functions) .IP \(bu Chebyshev polynomials of the second kind (U_n) .IP \(bu The incomplete gamma function .PP .SH PROCEDURES The package defines the following public procedures: .TP \fB::math::special::Beta\fR \fIx\fR \fIy\fR Compute the Beta function for arguments "x" and "y" .RS .TP float \fIx\fR First argument for the Beta function .TP float \fIy\fR Second argument for the Beta function .RE .sp .TP \fB::math::special::incBeta\fR \fIa\fR \fIb\fR \fIx\fR Compute the incomplete Beta function for argument "x" with parameters "a" and "b" .RS .TP float \fIa\fR First parameter for the incomplete Beta function, a > 0 .TP float \fIb\fR Second parameter for the incomplete Beta function, b > 0 .TP float \fIx\fR Argument for the incomplete Beta function .RE .sp .TP \fB::math::special::regIncBeta\fR \fIa\fR \fIb\fR \fIx\fR Compute the regularized incomplete Beta function for argument "x" with parameters "a" and "b" .RS .TP float \fIa\fR First parameter for the incomplete Beta function, a > 0 .TP float \fIb\fR Second parameter for the incomplete Beta function, b > 0 .TP float \fIx\fR Argument for the regularized incomplete Beta function .RE .sp .TP \fB::math::special::Gamma\fR \fIx\fR Compute the Gamma function for argument "x" .RS .TP float \fIx\fR Argument for the Gamma function .RE .sp .TP \fB::math::special::digamma\fR \fIx\fR Compute the digamma function (psi) for argument "x" .RS .TP float \fIx\fR Argument for the digamma function .RE .sp .TP \fB::math::special::erf\fR \fIx\fR Compute the error function for argument "x" .RS .TP float \fIx\fR |
︙ | ︙ |
Changes to idoc/man/files/modules/math/statistics.n.
︙ | ︙ | |||
347 348 349 350 351 352 353 354 355 356 357 358 359 360 | .sp \fB::math::statistics::test-Rchart\fR \fIcontrol\fR \fIdata\fR .sp \fB::math::statistics::test-Kruskal-Wallis\fR \fIconfidence\fR \fIargs\fR .sp \fB::math::statistics::analyse-Kruskal-Wallis\fR \fIargs\fR .sp \fB::math::statistics::group-rank\fR \fIargs\fR .sp \fB::math::statistics::test-Wilcoxon\fR \fIsample_a\fR \fIsample_b\fR .sp \fB::math::statistics::spearman-rank\fR \fIsample_a\fR \fIsample_b\fR .sp \fB::math::statistics::spearman-rank-extended\fR \fIsample_a\fR \fIsample_b\fR | > > > > | 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 | .sp \fB::math::statistics::test-Rchart\fR \fIcontrol\fR \fIdata\fR .sp \fB::math::statistics::test-Kruskal-Wallis\fR \fIconfidence\fR \fIargs\fR .sp \fB::math::statistics::analyse-Kruskal-Wallis\fR \fIargs\fR .sp \fB::math::statistics::test-Levene\fR \fIgroups\fR .sp \fB::math::statistics::test-Brown-Forsythe\fR \fIgroups\fR .sp \fB::math::statistics::group-rank\fR \fIargs\fR .sp \fB::math::statistics::test-Wilcoxon\fR \fIsample_a\fR \fIsample_b\fR .sp \fB::math::statistics::spearman-rank\fR \fIsample_a\fR \fIsample_b\fR .sp \fB::math::statistics::spearman-rank-extended\fR \fIsample_a\fR \fIsample_b\fR |
︙ | ︙ | |||
405 406 407 408 409 410 411 412 413 414 415 416 417 418 | .sp \fB::math::statistics::pdf-gumbel\fR \fIlocation\fR \fIscale\fR \fIvalue\fR .sp \fB::math::statistics::pdf-pareto\fR \fIscale\fR \fIshape\fR \fIvalue\fR .sp \fB::math::statistics::pdf-cauchy\fR \fIlocation\fR \fIscale\fR \fIvalue\fR .sp \fB::math::statistics::cdf-normal\fR \fImean\fR \fIstdev\fR \fIvalue\fR .sp \fB::math::statistics::cdf-lognormal\fR \fImean\fR \fIstdev\fR \fIvalue\fR .sp \fB::math::statistics::cdf-exponential\fR \fImean\fR \fIvalue\fR .sp \fB::math::statistics::cdf-uniform\fR \fIxmin\fR \fIxmax\fR \fIvalue\fR | > > > > > > | 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 | .sp \fB::math::statistics::pdf-gumbel\fR \fIlocation\fR \fIscale\fR \fIvalue\fR .sp \fB::math::statistics::pdf-pareto\fR \fIscale\fR \fIshape\fR \fIvalue\fR .sp \fB::math::statistics::pdf-cauchy\fR \fIlocation\fR \fIscale\fR \fIvalue\fR .sp \fB::math::statistics::pdf-laplace\fR \fIlocation\fR \fIscale\fR \fIvalue\fR .sp \fB::math::statistics::pdf-kumaraswamy\fR \fIa\fR \fIb\fR \fIvalue\fR .sp \fB::math::statistics::pdf-negative-binomial\fR \fIr\fR \fIp\fR \fIvalue\fR .sp \fB::math::statistics::cdf-normal\fR \fImean\fR \fIstdev\fR \fIvalue\fR .sp \fB::math::statistics::cdf-lognormal\fR \fImean\fR \fIstdev\fR \fIvalue\fR .sp \fB::math::statistics::cdf-exponential\fR \fImean\fR \fIvalue\fR .sp \fB::math::statistics::cdf-uniform\fR \fIxmin\fR \fIxmax\fR \fIvalue\fR |
︙ | ︙ | |||
434 435 436 437 438 439 440 441 442 443 444 445 446 447 | \fB::math::statistics::cdf-gumbel\fR \fIlocation\fR \fIscale\fR \fIvalue\fR .sp \fB::math::statistics::cdf-pareto\fR \fIscale\fR \fIshape\fR \fIvalue\fR .sp \fB::math::statistics::cdf-cauchy\fR \fIlocation\fR \fIscale\fR \fIvalue\fR .sp \fB::math::statistics::cdf-F\fR \fInf1\fR \fInf2\fR \fIvalue\fR .sp \fB::math::statistics::empirical-distribution\fR \fIvalues\fR .sp \fB::math::statistics::random-normal\fR \fImean\fR \fIstdev\fR \fInumber\fR .sp \fB::math::statistics::random-lognormal\fR \fImean\fR \fIstdev\fR \fInumber\fR .sp | > > > > > > | 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 | \fB::math::statistics::cdf-gumbel\fR \fIlocation\fR \fIscale\fR \fIvalue\fR .sp \fB::math::statistics::cdf-pareto\fR \fIscale\fR \fIshape\fR \fIvalue\fR .sp \fB::math::statistics::cdf-cauchy\fR \fIlocation\fR \fIscale\fR \fIvalue\fR .sp \fB::math::statistics::cdf-F\fR \fInf1\fR \fInf2\fR \fIvalue\fR .sp \fB::math::statistics::cdf-laplace\fR \fIlocation\fR \fIscale\fR \fIvalue\fR .sp \fB::math::statistics::cdf-kumaraswamy\fR \fIa\fR \fIb\fR \fIvalue\fR .sp \fB::math::statistics::cdf-negative-binomial\fR \fIr\fR \fIp\fR \fIvalue\fR .sp \fB::math::statistics::empirical-distribution\fR \fIvalues\fR .sp \fB::math::statistics::random-normal\fR \fImean\fR \fIstdev\fR \fInumber\fR .sp \fB::math::statistics::random-lognormal\fR \fImean\fR \fIstdev\fR \fInumber\fR .sp |
︙ | ︙ | |||
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 | \fB::math::statistics::random-weibull\fR \fIscale\fR \fIshape\fR \fInumber\fR .sp \fB::math::statistics::random-gumbel\fR \fIlocation\fR \fIscale\fR \fInumber\fR .sp \fB::math::statistics::random-pareto\fR \fIscale\fR \fIshape\fR \fInumber\fR .sp \fB::math::statistics::random-cauchy\fR \fIlocation\fR \fIscale\fR \fInumber\fR .sp \fB::math::statistics::histogram-uniform\fR \fIxmin\fR \fIxmax\fR \fIlimits\fR \fInumber\fR .sp \fB::math::statistics::incompleteGamma\fR \fIx\fR \fIp\fR ?tol? .sp \fB::math::statistics::incompleteBeta\fR \fIa\fR \fIb\fR \fIx\fR ?tol? .sp \fB::math::statistics::estimate-pareto\fR \fIvalues\fR .sp \fB::math::statistics::estimate-exponential\fR \fIvalues\fR .sp \fB::math::statistics::filter\fR \fIvarname\fR \fIdata\fR \fIexpression\fR .sp \fB::math::statistics::map\fR \fIvarname\fR \fIdata\fR \fIexpression\fR .sp \fB::math::statistics::samplescount\fR \fIvarname\fR \fIlist\fR \fIexpression\fR .sp \fB::math::statistics::subdivide\fR | > > > > > > > > > > | 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 | \fB::math::statistics::random-weibull\fR \fIscale\fR \fIshape\fR \fInumber\fR .sp \fB::math::statistics::random-gumbel\fR \fIlocation\fR \fIscale\fR \fInumber\fR .sp \fB::math::statistics::random-pareto\fR \fIscale\fR \fIshape\fR \fInumber\fR .sp \fB::math::statistics::random-cauchy\fR \fIlocation\fR \fIscale\fR \fInumber\fR .sp \fB::math::statistics::random-laplace\fR \fIlocation\fR \fIscale\fR \fInumber\fR .sp \fB::math::statistics::random-kumaraswamy\fR \fIa\fR \fIb\fR \fInumber\fR .sp \fB::math::statistics::random-negative-binomial\fR \fIr\fR \fIp\fR \fInumber\fR .sp \fB::math::statistics::histogram-uniform\fR \fIxmin\fR \fIxmax\fR \fIlimits\fR \fInumber\fR .sp \fB::math::statistics::incompleteGamma\fR \fIx\fR \fIp\fR ?tol? .sp \fB::math::statistics::incompleteBeta\fR \fIa\fR \fIb\fR \fIx\fR ?tol? .sp \fB::math::statistics::estimate-pareto\fR \fIvalues\fR .sp \fB::math::statistics::estimate-exponential\fR \fIvalues\fR .sp \fB::math::statistics::estimate-laplace\fR \fIvalues\fR .sp \fB::math::statistics::estimante-negative-binomial\fR \fIr\fR \fIvalues\fR .sp \fB::math::statistics::filter\fR \fIvarname\fR \fIdata\fR \fIexpression\fR .sp \fB::math::statistics::map\fR \fIvarname\fR \fIdata\fR \fIexpression\fR .sp \fB::math::statistics::samplescount\fR \fIvarname\fR \fIlist\fR \fIexpression\fR .sp \fB::math::statistics::subdivide\fR |
︙ | ︙ | |||
1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 | equal\&. .RS .TP list \fIargs\fR - Two or more lists of data .RE .sp .TP \fB::math::statistics::group-rank\fR \fIargs\fR Rank the groups of data with respect to the complete set\&. Returns a list consisting of the group ID, the value and the rank (possibly a rational number, in case of ties) for each data item\&. .RS .TP list \fIargs\fR - Two or more lists of data .RE .sp .TP \fB::math::statistics::test-Wilcoxon\fR \fIsample_a\fR \fIsample_b\fR Compute the Wilcoxon test statistic to determine if two samples have the same median or not\&. (The statistic can be regarded as standard normal, if the | > > > > > > > > > > > > > > > > > > > > > > > > > | | 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 | equal\&. .RS .TP list \fIargs\fR - Two or more lists of data .RE .sp .TP \fB::math::statistics::test-Levene\fR \fIgroups\fR Compute the Levene statistic to determine if groups of data have the same variance (are homoscadastic) or not\&. The data are organised in groups\&. This version uses the mean of the data as the measure to determine the deviations\&. The statistic is equivalent to an F statistic with degrees of freedom k-1 and N-k, k being the number of groups and N the total number of data\&. .RS .TP list \fIgroups\fR - List of groups of data .RE .sp .TP \fB::math::statistics::test-Brown-Forsythe\fR \fIgroups\fR Compute the Brown-Forsythe statistic to determine if groups of data have the same variance (are homoscadastic) or not\&. Like the Levene test, but this version uses the median of the data\&. .RS .TP list \fIgroups\fR - List of groups of data .RE .sp .TP \fB::math::statistics::group-rank\fR \fIargs\fR Rank the groups of data with respect to the complete set\&. Returns a list consisting of the group ID, the value and the rank (possibly a rational number, in case of ties) for each data item\&. .RS .TP list \fIargs\fR - Two or more lists of data .RE .sp .TP \fB::math::statistics::test-Wilcoxon\fR \fIsample_a\fR \fIsample_b\fR Compute the Wilcoxon test statistic to determine if two samples have the same median or not\&. (The statistic can be regarded as standard normal, if the sample sizes are both larger than 10\&.) Returns the value of this statistic\&. .RS .TP list \fIsample_a\fR - List of data comprising the first sample .TP list \fIsample_b\fR - List of data comprising the second sample |
︙ | ︙ | |||
1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 | float \fIscale\fR - Shape parameter .TP float \fIvalue\fR - Value for which the probability is required .RE .sp .TP \fB::math::statistics::cdf-normal\fR \fImean\fR \fIstdev\fR \fIvalue\fR Return the cumulative probability of a given value for a normal distribution with given mean and standard deviation, that is the probability for values up to the given one\&. .RS .TP | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 | float \fIscale\fR - Shape parameter .TP float \fIvalue\fR - Value for which the probability is required .RE .sp .TP \fB::math::statistics::pdf-laplace\fR \fIlocation\fR \fIscale\fR \fIvalue\fR Return the probability of a given value for a Laplace distribution with given location and shape parameters\&. The Laplace distribution consists of two exponential functions, is peaked and has heavier tails than the normal distribution\&. .RS .TP float \fIlocation\fR - Location parameter (mean) .TP float \fIscale\fR - Shape parameter .TP float \fIvalue\fR - Value for which the probability is required .RE .sp .TP \fB::math::statistics::pdf-kumaraswamy\fR \fIa\fR \fIb\fR \fIvalue\fR Return the probability of a given value for a Kumaraswamy distribution with given parameters a and b\&. The Kumaraswamy distribution is related to the Beta distribution, but has a tractable cumulative distribution function\&. .RS .TP float \fIa\fR - Parameter a .TP float \fIb\fR - Parameter b .TP float \fIvalue\fR - Value for which the probability is required .RE .sp .TP \fB::math::statistics::pdf-negative-binomial\fR \fIr\fR \fIp\fR \fIvalue\fR Return the probability of a given value for a negative binomial distribution with an allowed number of failures and the probability of success\&. .RS .TP int \fIr\fR - Allowed number of failures (at least 1) .TP float \fIp\fR - Probability of success .TP int \fIvalue\fR - Number of successes for which the probability is to be returned .RE .sp .TP \fB::math::statistics::cdf-normal\fR \fImean\fR \fIstdev\fR \fIvalue\fR Return the cumulative probability of a given value for a normal distribution with given mean and standard deviation, that is the probability for values up to the given one\&. .RS .TP |
︙ | ︙ | |||
1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 | .TP float \fInf2\fR - Degrees of freedom for the denominator .TP float \fIvalue\fR - Value for which the probability is required .RE .sp .TP \fB::math::statistics::empirical-distribution\fR \fIvalues\fR Return a list of values and their empirical probability\&. The values are sorted in increasing order\&. (The implementation follows the description at the corresponding Wikipedia page) .RS .TP | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 | .TP float \fInf2\fR - Degrees of freedom for the denominator .TP float \fIvalue\fR - Value for which the probability is required .RE .sp .TP \fB::math::statistics::cdf-laplace\fR \fIlocation\fR \fIscale\fR \fIvalue\fR Return the cumulative probability of a given value for a Laplace distribution with given location and shape parameters\&. The Laplace distribution consists of two exponential functions, is peaked and has heavier tails than the normal distribution\&. .RS .TP float \fIlocation\fR - Location parameter (mean) .TP float \fIscale\fR - Shape parameter .TP float \fIvalue\fR - Value for which the probability is required .RE .sp .TP \fB::math::statistics::cdf-kumaraswamy\fR \fIa\fR \fIb\fR \fIvalue\fR Return the cumulative probability of a given value for a Kumaraswamy distribution with given parameters a and b\&. The Kumaraswamy distribution is related to the Beta distribution, but has a tractable cumulative distribution function\&. .RS .TP float \fIa\fR - Parameter a .TP float \fIb\fR - Parameter b .TP float \fIvalue\fR - Value for which the probability is required .RE .sp .TP \fB::math::statistics::cdf-negative-binomial\fR \fIr\fR \fIp\fR \fIvalue\fR Return the cumulative probability of a given value for a negative binomial distribution with an allowed number of failures and the probability of success\&. .RS .TP int \fIr\fR - Allowed number of failures (at least 1) .TP float \fIp\fR - Probability of success .TP int \fIvalue\fR - Greatest number of successes .RE .sp .TP \fB::math::statistics::empirical-distribution\fR \fIvalues\fR Return a list of values and their empirical probability\&. The values are sorted in increasing order\&. (The implementation follows the description at the corresponding Wikipedia page) .RS .TP |
︙ | ︙ | |||
2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 | float \fIscale\fR - Scale parameter .TP int \fInumber\fR - Number of values to be returned .RE .sp .TP \fB::math::statistics::histogram-uniform\fR \fIxmin\fR \fIxmax\fR \fIlimits\fR \fInumber\fR Return the expected histogram for a uniform distribution\&. .RS .TP float \fIxmin\fR - Minimum value of the distribution | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 | float \fIscale\fR - Scale parameter .TP int \fInumber\fR - Number of values to be returned .RE .sp .TP \fB::math::statistics::random-laplace\fR \fIlocation\fR \fIscale\fR \fInumber\fR Return a list of "number" random values satisfying a Laplace distribution with given location and shape parameters\&. The Laplace distribution consists of two exponential functions, is peaked and has heavier tails than the normal distribution\&. .RS .TP float \fIlocation\fR - Location parameter (mean) .TP float \fIscale\fR - Shape parameter .TP int \fInumber\fR - Number of values to be returned .RE .sp .TP \fB::math::statistics::random-kumaraswamy\fR \fIa\fR \fIb\fR \fInumber\fR Return a list of "number" random values satisying a Kumaraswamy distribution with given parameters a and b\&. The Kumaraswamy distribution is related to the Beta distribution, but has a tractable cumulative distribution function\&. .RS .TP float \fIa\fR - Parameter a .TP float \fIb\fR - Parameter b .TP int \fInumber\fR - Number of values to be returned .RE .sp .TP \fB::math::statistics::random-negative-binomial\fR \fIr\fR \fIp\fR \fInumber\fR Return a list of "number" random values satisying a negative binomial distribution\&. .RS .TP int \fIr\fR - Allowed number of failures (at least 1) .TP float \fIp\fR - Probability of success .TP int \fInumber\fR - Number of values to be returned .RE .sp .TP \fB::math::statistics::histogram-uniform\fR \fIxmin\fR \fIxmax\fR \fIlimits\fR \fInumber\fR Return the expected histogram for a uniform distribution\&. .RS .TP float \fIxmin\fR - Minimum value of the distribution |
︙ | ︙ | |||
2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 | Estimate the parameter for the exponential distribution that comes closest to the given values\&. Returns an estimate of the one parameter and of the standard error\&. .RS .TP list \fIvalues\fR - List of values, assumed to be distributed according to an exponential distribution .RE .sp .PP TO DO: more function descriptions to be added .SH "DATA MANIPULATION" The data manipulation procedures act on lists or lists of lists: .TP \fB::math::statistics::filter\fR \fIvarname\fR \fIdata\fR \fIexpression\fR | > > > > > > > > > > > > > > > > > > > > > > > | 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 | Estimate the parameter for the exponential distribution that comes closest to the given values\&. Returns an estimate of the one parameter and of the standard error\&. .RS .TP list \fIvalues\fR - List of values, assumed to be distributed according to an exponential distribution .RE .sp .TP \fB::math::statistics::estimate-laplace\fR \fIvalues\fR Estimate the parameters for the Laplace distribution that comes closest to the given values\&. Returns an estimate of respectively the location and scale parameters, based on maximum likelihood\&. .RS .TP list \fIvalues\fR - List of values, assumed to be distributed according to an exponential distribution .RE .sp .TP \fB::math::statistics::estimante-negative-binomial\fR \fIr\fR \fIvalues\fR Estimate the probability of success for the negative binomial distribution that comes closest to the given values\&. The allowed number of failures must be given\&. .RS .TP int \fIr\fR - Allowed number of failures (at least 1) .TP int \fInumber\fR - List of values, assumed to be distributed according to a negative binomial distribution\&. .RE .sp .PP TO DO: more function descriptions to be added .SH "DATA MANIPULATION" The data manipulation procedures act on lists or lists of lists: .TP \fB::math::statistics::filter\fR \fIvarname\fR \fIdata\fR \fIexpression\fR |
︙ | ︙ |
Changes to idoc/man/files/modules/practcl/practcl.n.
1 2 3 4 | '\" '\" Generated from file 'practcl\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2016-2018 Sean Woods <yoda@etoyoc\&.com> '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 | '\" '\" Generated from file 'practcl\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2016-2018 Sean Woods <yoda@etoyoc\&.com> '\" .TH "practcl" n 0\&.16\&.4 tcllib "The The Proper Rational API for C to Tool Command Language Module" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, |
︙ | ︙ | |||
947 948 949 950 951 952 953 954 955 | on older interpreters this invokes zip via exec .TP proc \fBpractcl::sort_dict\fR \fIlist\fR Dictionary sort a key/value list\&. Needed because pre tcl8\&.6 does not have \fIlsort -stride 2\fR .TP proc \fBpractcl::local_os\fR .TP proc \fBpractcl::config\&.tcl\fR \fIpath\fR | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 | on older interpreters this invokes zip via exec .TP proc \fBpractcl::sort_dict\fR \fIlist\fR Dictionary sort a key/value list\&. Needed because pre tcl8\&.6 does not have \fIlsort -stride 2\fR .TP proc \fBpractcl::local_os\fR Returns a dictionary describing the local operating system\&. Fields return include: .RS .IP \(bu download - Filesystem path where fossil repositories and source tarballs are downloaded for the current user .IP \(bu EXEEXT - The extension to give to executables\&. (i\&.e\&. \&.exe on windows) .IP \(bu fossil_mirror - A URI for a local network web server who acts as a fossil repository mirror .IP \(bu local_install - Filesystem path where packages for local consumption by the current user are installed .IP \(bu prefix - The prefix as given to the Tcl core/TEA for installation to local_install in \&./configure .IP \(bu sandbox - The file location where this project unpacks external projects .IP \(bu TEACUP_PROFILE - The ActiveState/Teacup canonical name for this platform (i\&.e\&. win32-ix86 macosx10\&.5-i386-x86_84) .IP \(bu TEACUP_OS - The local operating system (windows, macosx, openbsd, etc)\&. Gives the same answer as tcl\&.m4, except that macosx is given as macosx instead of Darwin\&. .IP \(bu TEA_PLATFORM - The platform returned by uname -s-uname -r (on Unix), or "windows" on Windows .IP \(bu TEACUP_ARCH - The processor architecture for the local os (i\&.e\&. ix86, x86_64) .IP \(bu TEACUP_ARCH - The processor architecture for the local os (i\&.e\&. ix86, x86_64) .IP \(bu teapot - Filesystem path where teapot package files are downloaded for the current user .IP \(bu userhome - File path to store localized preferences, cache download files, etc for the current user .RE .IP This command uses a combination of local checks with Exec, any tclConfig\&.sh file that is resident, autoconf data where already computed, and data gleaned from a file named practcl\&.rc in userhome\&. The location for userhome varies by platform and operating system: .RS .IP \(bu Windows: ::env(LOCALAPPDATA)/Tcl .IP \(bu Macos: ~/Library/Application Support/Tcl .IP \(bu Other: ~/tcl .RE .TP proc \fBpractcl::config\&.tcl\fR \fIpath\fR A transparent call to ::practcl::read_configuration to preserve backward compadibility with older copies of Practcl .TP proc \fBpractcl::read_configuration\fR \fIpath\fR Detect local platform\&. This command looks for data gleaned by autoconf or autosetup in the path specified, or perform its own logic tests if neither has been run\&. A file named config\&.site present in the location indicates that this project is cross compiling, and the data stored in that file is used for the compiler and linker\&. .sp This command looks for information from the following files, in the following order: .RS .IP \(bu config\&.tcl - A file generated by autoconf/configure in newer editions of TEA, encoded as a Tcl script\&. .IP \(bu config\&.site - A file containing cross compiler information, encoded as a SH script .IP \(bu ::env(VisualStudioVersion) - On Windows, and environmental value that indicates MS Visual Studio is installed .RE .sp This command returns a dictionary containing all of the data cleaned from the sources above\&. In the absence of any guidance this command returns the same output as ::practcl::local_os\&. In this mode, if the environmental variable VisualStudioVersion exists, this command will provide a template of fields that are appropriate for compiling on Windows under Microsoft Visual Studio\&. The USEMSVC flag in the dictionary is a boolean flag to indicate if this is indeed the case\&. .TP proc \fBpractcl::tcllib_require\fR \fIpkg\fR ?\fIargs\fR? Try to load a package, and failing that retrieve tcllib .TP proc \fBpractcl::platform::tcl_core_options\fR \fIos\fR Return the string to pass to \&./configure to compile the Tcl core for the given OS\&. .RS .IP \(bu windows: --with-tzdata --with-encoding utf-8 .IP \(bu macosx: --enable-corefoundation=yes --enable-framework=no --with-tzdata --with-encoding utf-8 .IP \(bu other: --with-tzdata --with-encoding utf-8 .RE .TP proc \fBpractcl::platform::tk_core_options\fR \fIos\fR .TP proc \fBpractcl::read_rc_file\fR \fIfilename\fR ?\fIlocaldat\fR \fB\fR? Read a stylized key/value list stored in a file .TP proc \fBpractcl::read_sh_subst\fR \fIline\fR \fIinfo\fR |
︙ | ︙ | |||
1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 | .TP proc \fBpractcl::copyDir\fR \fId1\fR \fId2\fR ?\fItoplevel\fR \fB1\fR? Recursively copy the contents of \fId1\fR to \fId2\fR .TP proc \fBpractcl::buildModule\fR \fImodpath\fR .TP proc \fBpractcl::installModule\fR \fImodpath\fR \fIDEST\fR .TP proc \fBpractcl::trigger\fR ?\fIargs\fR? Trigger build targets, and recompute dependencies .sp Internals: .CS | > > > > > > > > > > > > > > | 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 | .TP proc \fBpractcl::copyDir\fR \fId1\fR \fId2\fR ?\fItoplevel\fR \fB1\fR? Recursively copy the contents of \fId1\fR to \fId2\fR .TP proc \fBpractcl::buildModule\fR \fImodpath\fR .TP proc \fBpractcl::installModule\fR \fImodpath\fR \fIDEST\fR Install a module from MODPATH to the directory specified\&. \fIdpath\fR is assumed to be the fully qualified path where module is to be placed\&. Any existing files will be deleted at that path\&. If the path is symlink the process will return with no error and no action\&. If the module has contents in the build/ directory that are newer than the \&.tcl files in the module source directory, and a build/build\&.tcl file exists, the build/build\&.tcl file is run\&. If the source directory includes a file named index\&.tcl, the directory is assumed to be in the tao style of modules, and the entire directory (and all subdirectories) are copied verbatim\&. If no index\&.tcl file is present, all \&.tcl files are copied from the module source directory, and a pkgIndex\&.tcl file is generated if non yet exists\&. I a folder named htdocs exists in the source directory, that directory is copied verbatim to the destination\&. .TP proc \fBpractcl::trigger\fR ?\fIargs\fR? Trigger build targets, and recompute dependencies .sp Internals: .CS |
︙ | ︙ |
Changes to idoc/man/files/modules/profiler/profiler.n.
1 2 3 | '\" '\" Generated from file 'profiler\&.man' by tcllib/doctools with format 'nroff' '\" | | | 1 2 3 4 5 6 7 8 9 10 11 | '\" '\" Generated from file 'profiler\&.man' by tcllib/doctools with format 'nroff' '\" .TH "profiler" n 0\&.5 tcllib "Tcl Profiler" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, |
︙ | ︙ | |||
271 272 273 274 275 276 277 | .. .BS .SH NAME profiler \- Tcl source code profiler .SH SYNOPSIS package require \fBTcl 8\&.3\fR .sp | | > > > > | 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 | .. .BS .SH NAME profiler \- Tcl source code profiler .SH SYNOPSIS package require \fBTcl 8\&.3\fR .sp package require \fBprofiler ?0\&.5?\fR .sp \fB::profiler::init\fR .sp \fB::profiler::dump\fR \fIpattern\fR .sp \fB::profiler::print\fR ?\fIpattern\fR? .sp \fB::profiler::reset\fR ?\fIpattern\fR? .sp \fB::profiler::suspend\fR ?\fIpattern\fR? .sp \fB::profiler::resume\fR ?\fIpattern\fR? .sp \fB::profiler::new-disabled\fR .sp \fB::profiler::new-enabled\fR .sp \fB::profiler::sortFunctions\fR \fIkey\fR .sp .BE .SH DESCRIPTION .PP The \fBprofiler\fR package provides a simple Tcl source code |
︙ | ︙ | |||
361 362 363 364 365 366 367 368 369 370 371 372 373 374 | .TP \fB::profiler::resume\fR ?\fIpattern\fR? Resume profiling for all functions matching \fIpattern\fR\&. If no pattern is specified, profiling will be resumed for all functions\&. This command should be invoked after suspending the profiler in the code\&. .TP \fB::profiler::sortFunctions\fR \fIkey\fR Return a list of functions sorted by a particular profiling statistic\&. Supported values for \fIkey\fR are: \fBcalls\fR, \fBexclusiveTime\fR, \fBcompileTime\fR, \fBnonCompileTime\fR, \fBtotalRuntime\fR, \fBavgExclusiveTime\fR, and \fBavgRuntime\fR\&. The return result is a list of lists, where each sublist consists of a function name and the value of \fIkey\fR for | > > > > > > > > > > > > | 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 | .TP \fB::profiler::resume\fR ?\fIpattern\fR? Resume profiling for all functions matching \fIpattern\fR\&. If no pattern is specified, profiling will be resumed for all functions\&. This command should be invoked after suspending the profiler in the code\&. .TP \fB::profiler::new-disabled\fR Change the initial profiling state for new procedures\&. Invoking this command disables profiling for all procedures created after this command until \fBnew-enabled\fR is invoked\&. Activate profiling of specific procedures via \fBresume\fR\&. .TP \fB::profiler::new-enabled\fR Change the initial profiling state for new procedures\&. Invoking this command enables profiling for all procedures created after this command until \fBnew-disabled\fR is invoked\&. Prevent profiling of specific procedures via \fBsuspend\fR\&. .TP \fB::profiler::sortFunctions\fR \fIkey\fR Return a list of functions sorted by a particular profiling statistic\&. Supported values for \fIkey\fR are: \fBcalls\fR, \fBexclusiveTime\fR, \fBcompileTime\fR, \fBnonCompileTime\fR, \fBtotalRuntime\fR, \fBavgExclusiveTime\fR, and \fBavgRuntime\fR\&. The return result is a list of lists, where each sublist consists of a function name and the value of \fIkey\fR for |
︙ | ︙ |
Changes to idoc/man/files/modules/struct/matrix.n.
1 2 | '\" '\" Generated from file 'matrix\&.man' by tcllib/doctools with format 'nroff' | | | | 1 2 3 4 5 6 7 8 9 10 11 12 | '\" '\" Generated from file 'matrix\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2002-2013,2019 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net> '\" .TH "struct::matrix" n 2\&.0\&.4 tcllib "Tcl Data Structures" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, |
︙ | ︙ | |||
272 273 274 275 276 277 278 | .. .BS .SH NAME struct::matrix \- Create and manipulate matrix objects .SH SYNOPSIS package require \fBTcl 8\&.2\fR .sp | | | 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 | .. .BS .SH NAME struct::matrix \- Create and manipulate matrix objects .SH SYNOPSIS package require \fBTcl 8\&.2\fR .sp package require \fBstruct::matrix ?2\&.0\&.4?\fR .sp \fB::struct::matrix\fR ?\fImatrixName\fR? ?\fB=\fR|\fB:=\fR|\fBas\fR|\fBdeserialize\fR \fIsource\fR? .sp \fBmatrixName\fR \fIoption\fR ?\fIarg arg \&.\&.\&.\fR? .sp \fImatrixName\fR \fB=\fR \fIsourcematrix\fR .sp |
︙ | ︙ | |||
846 847 848 849 850 851 852 | left-most button in the secondary navigation bar\&. .SH KEYWORDS matrix .SH CATEGORY Data structures .SH COPYRIGHT .nf | | | 846 847 848 849 850 851 852 853 854 855 | left-most button in the secondary navigation bar\&. .SH KEYWORDS matrix .SH CATEGORY Data structures .SH COPYRIGHT .nf Copyright (c) 2002-2013,2019 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net> .fi |
Changes to idoc/man/files/modules/struct/matrix1.n.
1 2 | '\" '\" Generated from file 'matrix1\&.man' by tcllib/doctools with format 'nroff' | | | | 1 2 3 4 5 6 7 8 9 10 11 12 | '\" '\" Generated from file 'matrix1\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2002,2019 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net> '\" .TH "struct::matrix_v1" n 1\&.2\&.2 tcllib "Tcl Data Structures" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, |
︙ | ︙ | |||
272 273 274 275 276 277 278 | .. .BS .SH NAME struct::matrix_v1 \- Create and manipulate matrix objects .SH SYNOPSIS package require \fBTcl 8\&.2\fR .sp | | | 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 | .. .BS .SH NAME struct::matrix_v1 \- Create and manipulate matrix objects .SH SYNOPSIS package require \fBTcl 8\&.2\fR .sp package require \fBstruct::matrix ?1\&.2\&.2?\fR .sp \fBmatrixName\fR \fIoption\fR ?\fIarg arg \&.\&.\&.\fR? .sp \fImatrixName\fR \fBadd column\fR ?\fIvalues\fR? .sp \fImatrixName\fR \fBadd row\fR ?\fIvalues\fR? .sp |
︙ | ︙ | |||
682 683 684 685 686 687 688 | left-most button in the secondary navigation bar\&. .SH KEYWORDS matrix .SH CATEGORY Data structures .SH COPYRIGHT .nf | | | 682 683 684 685 686 687 688 689 690 691 | left-most button in the secondary navigation bar\&. .SH KEYWORDS matrix .SH CATEGORY Data structures .SH COPYRIGHT .nf Copyright (c) 2002,2019 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net> .fi |
Changes to idoc/man/files/modules/virtchannel_base/halfpipe.n.
1 2 | '\" '\" Generated from file 'halfpipe\&.man' by tcllib/doctools with format 'nroff' | | | | 1 2 3 4 5 6 7 8 9 10 11 12 | '\" '\" Generated from file 'halfpipe\&.man' by tcllib/doctools with format 'nroff' '\" Copyright (c) 2009, 2019 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net> '\" .TH "tcl::chan::halfpipe" n 1\&.0\&.1 tcllib "Reflected/virtual channel support" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, |
︙ | ︙ | |||
276 277 278 279 280 281 282 | .SH SYNOPSIS package require \fBTcl 8\&.5\fR .sp package require \fBTclOO \fR .sp package require \fBtcl::chan::events ?1?\fR .sp | | < < | 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 | .SH SYNOPSIS package require \fBTcl 8\&.5\fR .sp package require \fBTclOO \fR .sp package require \fBtcl::chan::events ?1?\fR .sp package require \fBtcl::chan::halfpipe ?1\&.0\&.1?\fR .sp \fB::tcl::chan::halfpipe\fR ?\fB-option\fR \fIvalue\fR\&.\&.\&.? .sp \fIobjectCmd\fR \fBput\fR \fIbytes\fR .sp .BE .SH DESCRIPTION |
︙ | ︙ | |||
351 352 353 354 355 356 357 | left-most button in the secondary navigation bar\&. .SH KEYWORDS callbacks, fifo, in-memory channel, reflected channel, tip 219, virtual channel .SH CATEGORY Channels .SH COPYRIGHT .nf | | | 349 350 351 352 353 354 355 356 357 358 | left-most button in the secondary navigation bar\&. .SH KEYWORDS callbacks, fifo, in-memory channel, reflected channel, tip 219, virtual channel .SH CATEGORY Channels .SH COPYRIGHT .nf Copyright (c) 2009, 2019 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net> .fi |
Changes to idoc/www/tcllib/files/modules/blowfish/blowfish.html.
︙ | ︙ | |||
103 104 105 106 107 108 109 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> | | | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> <h1 class="doctools_title">blowfish(n) 1.0.5 tcllib "Blowfish Block Cipher"</h1> <div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> <p>blowfish - Implementation of the Blowfish block cipher</p> </div> <div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> <ul class="doctools_toc"> <li class="doctools_section"><a href="#toc">Table Of Contents</a></li> <li class="doctools_section"><a href="#synopsis">Synopsis</a></li> |
︙ | ︙ | |||
129 130 131 132 133 134 135 | <li class="doctools_section"><a href="#copyright">Copyright</a></li> </ul> </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> <li>package require <b class="pkgname">Tcl 8.4</b></li> | | | 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | <li class="doctools_section"><a href="#copyright">Copyright</a></li> </ul> </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> <li>package require <b class="pkgname">Tcl 8.4</b></li> <li>package require <b class="pkgname">blowfish <span class="opt">?1.0.5?</span></b></li> </ul> <ul class="doctools_syntax"> <li><a href="#1"><b class="cmd">::blowfish::blowfish</b> <span class="opt">?<i class="arg">-mode [ecb|cbc]</i>?</span> <span class="opt">?<i class="arg">-dir [encrypt|decrypt]</i>?</span> <i class="arg">-key keydata</i> <span class="opt">?<i class="arg">-iv vector</i>?</span> <span class="opt">?<i class="arg">-out channel</i>?</span> <span class="opt">?<i class="arg">-chunksize size</i>?</span> <span class="opt">?<i class="arg">-pad padchar</i>?</span> [ <i class="arg">-in channel</i> | <span class="opt">?<i class="arg">--</i>?</span> <i class="arg">data</i> ]</a></li> <li><a href="#2"><b class="cmd">::blowfish::Init</b> <i class="arg">mode</i> <i class="arg">keydata</i> <i class="arg">iv</i></a></li> <li><a href="#3"><b class="cmd">::blowfish::Encrypt</b> <i class="arg">Key</i> <i class="arg">data</i></a></li> <li><a href="#4"><b class="cmd">::blowfish::Decrypt</b> <i class="arg">Key</i> <i class="arg">data</i></a></li> <li><a href="#5"><b class="cmd">::blowfish::Reset</b> <i class="arg">Key</i> <i class="arg">iv</i></a></li> |
︙ | ︙ |
Changes to idoc/www/tcllib/files/modules/clay/clay.html.
︙ | ︙ | |||
103 104 105 106 107 108 109 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> | | | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> <h1 class="doctools_title">clay(n) 0.8.6 tcllib "Clay Framework"</h1> <div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> <p>clay - A minimalist framework for large scale OO Projects</p> </div> <div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> <ul class="doctools_toc"> <li class="doctools_section"><a href="#toc">Table Of Contents</a></li> <li class="doctools_section"><a href="#synopsis">Synopsis</a></li> |
︙ | ︙ | |||
152 153 154 155 156 157 158 | <li><a href="#6">proc <b class="cmd">clay::dynamic_arguments</b> <i class="arg">ensemble</i> <i class="arg">method</i> <i class="arg">arglist</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#7">proc <b class="cmd">clay::dynamic_wrongargs_message</b> <i class="arg">arglist</i></a></li> <li><a href="#8">proc <b class="cmd">clay::is_dict</b> <i class="arg">d</i></a></li> <li><a href="#9">proc <b class="cmd">clay::is_null</b> <i class="arg">value</i></a></li> <li><a href="#10">proc <b class="cmd">clay::leaf</b> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#11">proc <b class="cmd">clay::K</b> <i class="arg">a</i> <i class="arg">b</i></a></li> <li><a href="#12">proc <b class="cmd">clay::noop</b> <span class="opt">?<i class="arg">args</i>?</span></a></li> | > > > > | | | | | | | | | | | | | | | | | | | | < < < < > > > > | | | | | | | | | | | | | | | | | | | | < < < < > | | | | | | | | | | > | | | | | | | | | | | | | | | | > | | | | 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 | <li><a href="#6">proc <b class="cmd">clay::dynamic_arguments</b> <i class="arg">ensemble</i> <i class="arg">method</i> <i class="arg">arglist</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#7">proc <b class="cmd">clay::dynamic_wrongargs_message</b> <i class="arg">arglist</i></a></li> <li><a href="#8">proc <b class="cmd">clay::is_dict</b> <i class="arg">d</i></a></li> <li><a href="#9">proc <b class="cmd">clay::is_null</b> <i class="arg">value</i></a></li> <li><a href="#10">proc <b class="cmd">clay::leaf</b> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#11">proc <b class="cmd">clay::K</b> <i class="arg">a</i> <i class="arg">b</i></a></li> <li><a href="#12">proc <b class="cmd">clay::noop</b> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#13">proc <b class="cmd">clay::cleanup</b></a></li> <li><a href="#14">proc <b class="cmd">clay::object_create</b> <i class="arg">objname</i> <span class="opt">?<i class="arg">class</i> <b class="const"></b>?</span></a></li> <li><a href="#15">proc <b class="cmd">clay::object_rename</b> <i class="arg">object</i> <i class="arg">newname</i></a></li> <li><a href="#16">proc <b class="cmd">clay::object_destroy</b> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#17">proc <b class="cmd">clay::path</b> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#18">proc <b class="cmd">clay::putb</b> <span class="opt">?<i class="arg">map</i>?</span> <i class="arg">text</i></a></li> <li><a href="#19">proc <b class="cmd">clay::script_path</b></a></li> <li><a href="#20">proc <b class="cmd">clay::NSNormalize</b> <i class="arg">qualname</i></a></li> <li><a href="#21">proc <b class="cmd">clay::uuid_generate</b> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#22">proc <b class="cmd">clay::uuid::generate_tcl_machinfo</b></a></li> <li><a href="#23">proc <b class="cmd">clay::uuid::tostring</b> <i class="arg">uuid</i></a></li> <li><a href="#24">proc <b class="cmd">clay::uuid::fromstring</b> <i class="arg">uuid</i></a></li> <li><a href="#25">proc <b class="cmd">clay::uuid::equal</b> <i class="arg">left</i> <i class="arg">right</i></a></li> <li><a href="#26">proc <b class="cmd">clay::uuid</b> <i class="arg">cmd</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#27">proc <b class="cmd">clay::tree::sanitize</b> <i class="arg">dict</i></a></li> <li><a href="#28">proc <b class="cmd">clay::tree::_sanitizeb</b> <i class="arg">path</i> <i class="arg">varname</i> <i class="arg">dict</i></a></li> <li><a href="#29">proc <b class="cmd">clay::tree::storage</b> <i class="arg">rawpath</i></a></li> <li><a href="#30">proc <b class="cmd">clay::tree::dictset</b> <i class="arg">varname</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#31">proc <b class="cmd">clay::tree::dictmerge</b> <i class="arg">varname</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#32">proc <b class="cmd">clay::tree::merge</b> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#33">proc <b class="cmd">dictargs::proc</b> <i class="arg">name</i> <i class="arg">argspec</i> <i class="arg">body</i></a></li> <li><a href="#34">proc <b class="cmd">dictargs::method</b> <i class="arg">name</i> <i class="arg">argspec</i> <i class="arg">body</i></a></li> <li><a href="#35">proc <b class="cmd">clay::dialect::Push</b> <i class="arg">class</i></a></li> <li><a href="#36">proc <b class="cmd">clay::dialect::Peek</b></a></li> <li><a href="#37">proc <b class="cmd">clay::dialect::Pop</b></a></li> <li><a href="#38">proc <b class="cmd">clay::dialect::create</b> <i class="arg">name</i> <span class="opt">?<i class="arg">parent</i> <b class="const"></b>?</span></a></li> <li><a href="#39">proc <b class="cmd">clay::dialect::NSNormalize</b> <i class="arg">namespace</i> <i class="arg">qualname</i></a></li> <li><a href="#40">proc <b class="cmd">clay::dialect::DefineThunk</b> <i class="arg">target</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#41">proc <b class="cmd">clay::dialect::Canonical</b> <i class="arg">namespace</i> <i class="arg">NSpace</i> <i class="arg">class</i></a></li> <li><a href="#42">proc <b class="cmd">clay::dialect::Define</b> <i class="arg">namespace</i> <i class="arg">class</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#43">proc <b class="cmd">clay::dialect::Aliases</b> <i class="arg">namespace</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#44">proc <b class="cmd">clay::dialect::SuperClass</b> <i class="arg">namespace</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#45">proc <b class="cmd">clay::dynamic_methods</b> <i class="arg">class</i></a></li> <li><a href="#46">proc <b class="cmd">clay::dynamic_methods_class</b> <i class="arg">thisclass</i></a></li> <li><a href="#47">proc <b class="cmd">clay::define::Array</b> <i class="arg">name</i> <span class="opt">?<i class="arg">values</i> <b class="const"></b>?</span></a></li> <li><a href="#48">proc <b class="cmd">clay::define::Delegate</b> <i class="arg">name</i> <i class="arg">info</i></a></li> <li><a href="#49">proc <b class="cmd">clay::define::constructor</b> <i class="arg">arglist</i> <i class="arg">rawbody</i></a></li> <li><a href="#50">proc <b class="cmd">clay::define::Class_Method</b> <i class="arg">name</i> <i class="arg">arglist</i> <i class="arg">body</i></a></li> <li><a href="#51">proc <b class="cmd">clay::define::class_method</b> <i class="arg">name</i> <i class="arg">arglist</i> <i class="arg">body</i></a></li> <li><a href="#52">proc <b class="cmd">clay::define::clay</b> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#53">proc <b class="cmd">clay::define::destructor</b> <i class="arg">rawbody</i></a></li> <li><a href="#54">proc <b class="cmd">clay::define::Dict</b> <i class="arg">name</i> <span class="opt">?<i class="arg">values</i> <b class="const"></b>?</span></a></li> <li><a href="#55">proc <b class="cmd">clay::define::Option</b> <i class="arg">name</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#56">proc <b class="cmd">clay::define::Method</b> <i class="arg">name</i> <i class="arg">argstyle</i> <i class="arg">argspec</i> <i class="arg">body</i></a></li> <li><a href="#57">proc <b class="cmd">clay::define::Option_Class</b> <i class="arg">name</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#58">proc <b class="cmd">clay::define::Variable</b> <i class="arg">name</i> <span class="opt">?<i class="arg">default</i> <b class="const"></b>?</span></a></li> <li><a href="#59">proc <b class="cmd">clay::ensemble_methodbody</b> <i class="arg">ensemble</i> <i class="arg">einfo</i></a></li> <li><a href="#60">proc <b class="cmd">clay::define::Ensemble</b> <i class="arg">rawmethod</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#61">proc <b class="cmd">clay::event::cancel</b> <i class="arg">self</i> <span class="opt">?<i class="arg">task</i> <b class="const">*</b>?</span></a></li> <li><a href="#62">proc <b class="cmd">clay::event::generate</b> <i class="arg">self</i> <i class="arg">event</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#63">proc <b class="cmd">clay::event::nextid</b></a></li> <li><a href="#64">proc <b class="cmd">clay::event::Notification_list</b> <i class="arg">self</i> <i class="arg">event</i> <span class="opt">?<i class="arg">stackvar</i> <b class="const"></b>?</span></a></li> <li><a href="#65">proc <b class="cmd">clay::event::notify</b> <i class="arg">rcpt</i> <i class="arg">sender</i> <i class="arg">event</i> <i class="arg">eventinfo</i></a></li> <li><a href="#66">proc <b class="cmd">clay::event::process</b> <i class="arg">self</i> <i class="arg">handle</i> <i class="arg">script</i></a></li> <li><a href="#67">proc <b class="cmd">clay::event::schedule</b> <i class="arg">self</i> <i class="arg">handle</i> <i class="arg">interval</i> <i class="arg">script</i></a></li> <li><a href="#68">proc <b class="cmd">clay::event::subscribe</b> <i class="arg">self</i> <i class="arg">who</i> <i class="arg">event</i></a></li> <li><a href="#69">proc <b class="cmd">clay::event::unsubscribe</b> <i class="arg">self</i> <span class="opt">?<i class="arg">args</i>?</span></a></li> <li><a href="#70">proc <b class="cmd">clay::singleton</b> <i class="arg">name</i> <i class="arg">script</i></a></li> <li><a href="#71">method <b class="cmd">clay ancestors</b></a></li> <li><a href="#72">method <b class="cmd">clay dump</b></a></li> <li><a href="#73">method <b class="cmd">clay find</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></li> <li><a href="#74">method <b class="cmd">clay get</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></li> <li><a href="#75">method <b class="cmd">clay GET</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></li> <li><a href="#76">method <b class="cmd">clay merge</b> <i class="arg">dict</i> <span class="opt">?<b class="option">dict...</b>?</span></a></li> <li><a href="#77">method <b class="cmd">clay replace</b> <i class="arg">dictionary</i></a></li> <li><a href="#78">method <b class="cmd">clay search</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></li> <li><a href="#79">method <b class="cmd">clay set</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span> <i class="arg">value</i></a></li> <li><a href="#80">method <b class="cmd">clay ancestors</b></a></li> <li><a href="#81">method <b class="cmd">clay cache</b> <i class="arg">path</i> <i class="arg">value</i></a></li> <li><a href="#82">method <b class="cmd">clay cget</b> <i class="arg">field</i></a></li> <li><a href="#83">method <b class="cmd">clay delegate</b> <span class="opt">?<i class="arg">stub</i>?</span> <span class="opt">?<i class="arg">object</i>?</span></a></li> <li><a href="#84">method <b class="cmd">clay dump</b></a></li> <li><a href="#85">method <b class="cmd">clay ensemble_map</b></a></li> <li><a href="#86">method <b class="cmd">clay eval</b> <i class="arg">script</i></a></li> <li><a href="#87">method <b class="cmd">clay evolve</b></a></li> <li><a href="#88">method <b class="cmd">clay exists</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></li> <li><a href="#89">method <b class="cmd">clay flush</b></a></li> <li><a href="#90">method <b class="cmd">clay forward</b> <i class="arg">method</i> <i class="arg">object</i></a></li> <li><a href="#91">method <b class="cmd">clay get</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></li> <li><a href="#92">method <b class="cmd">clay leaf</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></li> <li><a href="#93">method <b class="cmd">clay merge</b> <i class="arg">dict</i> <span class="opt">?<b class="option">dict...</b>?</span></a></li> <li><a href="#94">method <b class="cmd">clay mixin</b> <i class="arg">class</i> <span class="opt">?<b class="option">class...</b>?</span></a></li> <li><a href="#95">method <b class="cmd">clay mixinmap</b> <span class="opt">?<i class="arg">stub</i>?</span> <span class="opt">?<i class="arg">classes</i>?</span></a></li> <li><a href="#96">method <b class="cmd">clay provenance</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></li> <li><a href="#97">method <b class="cmd">clay replace</b> <i class="arg">dictionary</i></a></li> <li><a href="#98">method <b class="cmd">clay search</b> <i class="arg">path</i> <i class="arg">valuevar</i> <i class="arg">isleafvar</i></a></li> <li><a href="#99">method <b class="cmd">clay source</b> <i class="arg">filename</i></a></li> <li><a href="#100">method <b class="cmd">clay set</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span> <i class="arg">value</i></a></li> <li><a href="#101">method <b class="cmd">InitializePublic</b></a></li> </ul> </div> </div> <div id="section1" class="doctools_section"><h2><a name="section1">Description</a></h2> <p>Clay introduces a method ensemble to both <b class="class">oo::class</b> and <b class="class">oo::object</b> called clay. This ensemble handles all of the high level interactions within the framework. Clay stores structured data. Clan manages method delegation. Clay has facilities to |
︙ | ︙ | |||
372 373 374 375 376 377 378 | <dt><a name="11">proc <b class="cmd">clay::K</b> <i class="arg">a</i> <i class="arg">b</i></a></dt> <dd></dd> <dt><a name="12">proc <b class="cmd">clay::noop</b> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>Perform a noop. Useful in prototyping for commenting out blocks of code without actually having to comment them out. It also makes a handy default for method delegation if a delegate has not been assigned yet.</p></dd> | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > > > > > | | < < < < < < < < | 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 | <dt><a name="11">proc <b class="cmd">clay::K</b> <i class="arg">a</i> <i class="arg">b</i></a></dt> <dd></dd> <dt><a name="12">proc <b class="cmd">clay::noop</b> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>Perform a noop. Useful in prototyping for commenting out blocks of code without actually having to comment them out. It also makes a handy default for method delegation if a delegate has not been assigned yet.</p></dd> <dt><a name="13">proc <b class="cmd">clay::cleanup</b></a></dt> <dd><p>Process the queue of objects to be destroyed</p></dd> <dt><a name="14">proc <b class="cmd">clay::object_create</b> <i class="arg">objname</i> <span class="opt">?<i class="arg">class</i> <b class="const"></b>?</span></a></dt> <dd></dd> <dt><a name="15">proc <b class="cmd">clay::object_rename</b> <i class="arg">object</i> <i class="arg">newname</i></a></dt> <dd></dd> <dt><a name="16">proc <b class="cmd">clay::object_destroy</b> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>Mark an objects for destruction on the next cleanup</p></dd> <dt><a name="17">proc <b class="cmd">clay::path</b> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd></dd> <dt><a name="18">proc <b class="cmd">clay::putb</b> <span class="opt">?<i class="arg">map</i>?</span> <i class="arg">text</i></a></dt> <dd><p>Append a line of text to a variable. Optionally apply a string mapping.</p></dd> <dt><a name="19">proc <b class="cmd">clay::script_path</b></a></dt> <dd></dd> <dt><a name="20">proc <b class="cmd">clay::NSNormalize</b> <i class="arg">qualname</i></a></dt> <dd></dd> <dt><a name="21">proc <b class="cmd">clay::uuid_generate</b> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd></dd> <dt><a name="22">proc <b class="cmd">clay::uuid::generate_tcl_machinfo</b></a></dt> <dd></dd> <dt><a name="23">proc <b class="cmd">clay::uuid::tostring</b> <i class="arg">uuid</i></a></dt> <dd></dd> <dt><a name="24">proc <b class="cmd">clay::uuid::fromstring</b> <i class="arg">uuid</i></a></dt> <dd><p>Convert a string representation of a uuid into its binary format.</p></dd> <dt><a name="25">proc <b class="cmd">clay::uuid::equal</b> <i class="arg">left</i> <i class="arg">right</i></a></dt> <dd><p>Compare two uuids for equality.</p></dd> <dt><a name="26">proc <b class="cmd">clay::uuid</b> <i class="arg">cmd</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>uuid generate -> string rep of a new uuid uuid equal uuid1 uuid2</p></dd> <dt><a name="27">proc <b class="cmd">clay::tree::sanitize</b> <i class="arg">dict</i></a></dt> <dd><p>Output a dictionary removing any . entries added by <b class="function">clay::tree::merge</b></p></dd> <dt><a name="28">proc <b class="cmd">clay::tree::_sanitizeb</b> <i class="arg">path</i> <i class="arg">varname</i> <i class="arg">dict</i></a></dt> <dd><p>Helper function for ::clay::tree::sanitize Formats the string representation for a dictionary element within a human readable stream of lines, and determines if it needs to call itself with further indentation to express a sub-branch</p></dd> <dt><a name="29">proc <b class="cmd">clay::tree::storage</b> <i class="arg">rawpath</i></a></dt> <dd><p>Return the path as a storage path for clay::tree with all branch terminators removed. This command will also break arguments up if they contain /.</p> <p>Example:</p> <pre class="doctools_example"> > clay::tree::storage {foo bar baz bang} foo bar baz bang > clay::tree::storage {foo bar baz bang/} foo bar baz bang > clay::tree::storage {foo bar baz bang:} foo bar baz bang: > clay::tree::storage {foo/bar/baz bang:} foo bar baz bang: > clay::tree::storage {foo/bar/baz/bang} foo bar baz bang </pre> </dd> <dt><a name="30">proc <b class="cmd">clay::tree::dictset</b> <i class="arg">varname</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>Set an element with a recursive dictionary, marking all branches on the way down to the final element. If the value does not exists in the nested dictionary it is added as a leaf. If the value already exists as a branch the value given is merged if the value is a valid dict. If the incoming value is not a valid dict, the value overrides the value stored, and the value is treated as a leaf from then on.</p> <p>Example:</p> <pre class="doctools_example"> > set r {} > ::clay::tree::dictset r option color default Green . {} option {. {} color {. {} default Green}} > ::clay::tree::dictset r option {Something not dictlike} . {} option {Something not dictlike} # Note that if the value is not a dict, and you try to force it to be # an error with be thrown on the merge > ::clay::tree::dictset r option color default Blue missing value to go with key </pre> </dd> <dt><a name="31">proc <b class="cmd">clay::tree::dictmerge</b> <i class="arg">varname</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>A recursive form of dict merge, intended for modifying variables in place.</p> <p>Example:</p> <pre class="doctools_example"> > set mydict {sub/ {sub/ {description {a block of text}}}} > ::clay::tree::dictmerge mydict {sub/ {sub/ {field {another block of text}}}}] > clay::tree::print $mydict sub/ { sub/ { description {a block of text} field {another block of text} } } </pre> </dd> <dt><a name="32">proc <b class="cmd">clay::tree::merge</b> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>A recursive form of dict merge</p> <p>A routine to recursively dig through dicts and merge adapted from http://stevehavelka.com/tcl-dict-operation-nested-merge/</p> <p>Example:</p> <pre class="doctools_example"> > set mydict {sub/ {sub/ {description {a block of text}}}} > set odict [clay::tree::merge $mydict {sub/ {sub/ {field {another block of text}}}}] > clay::tree::print $odict sub/ { sub/ { description {a block of text} field {another block of text} } } </pre> </dd> <dt><a name="33">proc <b class="cmd">dictargs::proc</b> <i class="arg">name</i> <i class="arg">argspec</i> <i class="arg">body</i></a></dt> <dd><p>Named Procedures as new command</p></dd> <dt><a name="34">proc <b class="cmd">dictargs::method</b> <i class="arg">name</i> <i class="arg">argspec</i> <i class="arg">body</i></a></dt> <dd></dd> <dt><a name="35">proc <b class="cmd">clay::dialect::Push</b> <i class="arg">class</i></a></dt> <dd></dd> <dt><a name="36">proc <b class="cmd">clay::dialect::Peek</b></a></dt> <dd></dd> <dt><a name="37">proc <b class="cmd">clay::dialect::Pop</b></a></dt> <dd></dd> <dt><a name="38">proc <b class="cmd">clay::dialect::create</b> <i class="arg">name</i> <span class="opt">?<i class="arg">parent</i> <b class="const"></b>?</span></a></dt> <dd><p>This proc will generate a namespace, a "mother of all classes", and a rudimentary set of policies for this dialect.</p></dd> <dt><a name="39">proc <b class="cmd">clay::dialect::NSNormalize</b> <i class="arg">namespace</i> <i class="arg">qualname</i></a></dt> <dd><p>Support commands; not intended to be called directly.</p></dd> <dt><a name="40">proc <b class="cmd">clay::dialect::DefineThunk</b> <i class="arg">target</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd></dd> <dt><a name="41">proc <b class="cmd">clay::dialect::Canonical</b> <i class="arg">namespace</i> <i class="arg">NSpace</i> <i class="arg">class</i></a></dt> <dd></dd> <dt><a name="42">proc <b class="cmd">clay::dialect::Define</b> <i class="arg">namespace</i> <i class="arg">class</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>Implementation of the languages' define command</p></dd> <dt><a name="43">proc <b class="cmd">clay::dialect::Aliases</b> <i class="arg">namespace</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd></dd> <dt><a name="44">proc <b class="cmd">clay::dialect::SuperClass</b> <i class="arg">namespace</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd></dd> <dt><a name="45">proc <b class="cmd">clay::dynamic_methods</b> <i class="arg">class</i></a></dt> <dd></dd> <dt><a name="46">proc <b class="cmd">clay::dynamic_methods_class</b> <i class="arg">thisclass</i></a></dt> <dd></dd> <dt><a name="47">proc <b class="cmd">clay::define::Array</b> <i class="arg">name</i> <span class="opt">?<i class="arg">values</i> <b class="const"></b>?</span></a></dt> <dd><p>New OO Keywords for clay</p></dd> <dt><a name="48">proc <b class="cmd">clay::define::Delegate</b> <i class="arg">name</i> <i class="arg">info</i></a></dt> <dd><p>An annotation that objects of this class interact with delegated methods. The annotation is intended to be a dictionary, and the only reserved key is <em>description</em>, a human readable description.</p></dd> <dt><a name="49">proc <b class="cmd">clay::define::constructor</b> <i class="arg">arglist</i> <i class="arg">rawbody</i></a></dt> <dd></dd> <dt><a name="50">proc <b class="cmd">clay::define::Class_Method</b> <i class="arg">name</i> <i class="arg">arglist</i> <i class="arg">body</i></a></dt> <dd><p>Specify the a method for the class object itself, instead of for objects of the class</p></dd> <dt><a name="51">proc <b class="cmd">clay::define::class_method</b> <i class="arg">name</i> <i class="arg">arglist</i> <i class="arg">body</i></a></dt> <dd><p>And alias to the new Class_Method keyword</p></dd> <dt><a name="52">proc <b class="cmd">clay::define::clay</b> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd></dd> <dt><a name="53">proc <b class="cmd">clay::define::destructor</b> <i class="arg">rawbody</i></a></dt> <dd></dd> <dt><a name="54">proc <b class="cmd">clay::define::Dict</b> <i class="arg">name</i> <span class="opt">?<i class="arg">values</i> <b class="const"></b>?</span></a></dt> <dd></dd> <dt><a name="55">proc <b class="cmd">clay::define::Option</b> <i class="arg">name</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>Define an option for the class</p></dd> <dt><a name="56">proc <b class="cmd">clay::define::Method</b> <i class="arg">name</i> <i class="arg">argstyle</i> <i class="arg">argspec</i> <i class="arg">body</i></a></dt> <dd></dd> <dt><a name="57">proc <b class="cmd">clay::define::Option_Class</b> <i class="arg">name</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>Define a class of options All field / value pairs will be be inherited by an option that specify <em>name</em> as it class field.</p></dd> <dt><a name="58">proc <b class="cmd">clay::define::Variable</b> <i class="arg">name</i> <span class="opt">?<i class="arg">default</i> <b class="const"></b>?</span></a></dt> <dd><p>This keyword can also be expressed:</p> <pre class="doctools_example">property variable NAME {default DEFAULT}</pre> <p>Variables registered in the variable property are also initialized (if missing) when the object changes class via the <em>morph</em> method.</p></dd> <dt><a name="59">proc <b class="cmd">clay::ensemble_methodbody</b> <i class="arg">ensemble</i> <i class="arg">einfo</i></a></dt> <dd><p>Produce the body of an ensemble's public dispatch method ensemble is the name of the the ensemble. einfo is a dictionary of methods for the ensemble, and each value is a script to execute on dispatch</p> <p>Example:</p> <pre class="doctools_example"> ::clay::ensemble_methodbody foo { bar {tailcall my Foo_bar {*}$args} baz {tailcall my Foo_baz {*}$args} clock {return [clock seconds]} default {puts "You gave me $method"} } </pre> </dd> <dt><a name="60">proc <b class="cmd">clay::define::Ensemble</b> <i class="arg">rawmethod</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd></dd> <dt><a name="61">proc <b class="cmd">clay::event::cancel</b> <i class="arg">self</i> <span class="opt">?<i class="arg">task</i> <b class="const">*</b>?</span></a></dt> <dd><p>Cancel a scheduled event</p></dd> <dt><a name="62">proc <b class="cmd">clay::event::generate</b> <i class="arg">self</i> <i class="arg">event</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>Generate an event Adds a subscription mechanism for objects to see who has recieved this event and prevent spamming or infinite recursion</p></dd> |
︙ | ︙ | |||
563 564 565 566 567 568 569 570 571 572 573 574 575 | <dd><p>Evaluate an event script in the global namespace</p></dd> <dt><a name="67">proc <b class="cmd">clay::event::schedule</b> <i class="arg">self</i> <i class="arg">handle</i> <i class="arg">interval</i> <i class="arg">script</i></a></dt> <dd><p>Schedule an event to occur later</p></dd> <dt><a name="68">proc <b class="cmd">clay::event::subscribe</b> <i class="arg">self</i> <i class="arg">who</i> <i class="arg">event</i></a></dt> <dd><p>Subscribe an object to an event pattern</p></dd> <dt><a name="69">proc <b class="cmd">clay::event::unsubscribe</b> <i class="arg">self</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>Unsubscribe an object from an event pattern</p></dd> </dl> </div> <div id="section3" class="doctools_section"><h2><a name="section3">Classes</a></h2> <div id="subsection4" class="doctools_subsection"><h3><a name="subsection4">Class clay::class</a></h3> <p><b class="class">Methods</b></p> <dl class="doctools_definitions"> | > > | | | | | | | | | | > > | | | | | | | | | | | | | | | | > > | | | | 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 | <dd><p>Evaluate an event script in the global namespace</p></dd> <dt><a name="67">proc <b class="cmd">clay::event::schedule</b> <i class="arg">self</i> <i class="arg">handle</i> <i class="arg">interval</i> <i class="arg">script</i></a></dt> <dd><p>Schedule an event to occur later</p></dd> <dt><a name="68">proc <b class="cmd">clay::event::subscribe</b> <i class="arg">self</i> <i class="arg">who</i> <i class="arg">event</i></a></dt> <dd><p>Subscribe an object to an event pattern</p></dd> <dt><a name="69">proc <b class="cmd">clay::event::unsubscribe</b> <i class="arg">self</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>Unsubscribe an object from an event pattern</p></dd> <dt><a name="70">proc <b class="cmd">clay::singleton</b> <i class="arg">name</i> <i class="arg">script</i></a></dt> <dd><p>An object which is intended to be it's own class.</p></dd> </dl> </div> <div id="section3" class="doctools_section"><h2><a name="section3">Classes</a></h2> <div id="subsection4" class="doctools_subsection"><h3><a name="subsection4">Class clay::class</a></h3> <p><b class="class">Methods</b></p> <dl class="doctools_definitions"> <dt><a name="71">method <b class="cmd">clay ancestors</b></a></dt> <dd><p>Return this class and all ancestors in search order.</p></dd> <dt><a name="72">method <b class="cmd">clay dump</b></a></dt> <dd><p>Return a complete dump of this object's clay data, but only this object's clay data.</p></dd> <dt><a name="73">method <b class="cmd">clay find</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></dt> <dd><p>Pull a chunk of data from the clay system. If the last element of <em>path</em> is a branch, returns a recursive merge of all data from this object and it's constituent classes of the data in that branch. If the last element is a leaf, search this object for a matching leaf, or search all constituent classes for a matching leaf and return the first value found. If no value is found, returns an empty string. If a branch is returned the topmost . entry is omitted.</p></dd> <dt><a name="74">method <b class="cmd">clay get</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></dt> <dd><p>Pull a chunk of data from the class's clay system. If no value is found, returns an empty string. If a branch is returned the topmost . entry is omitted.</p></dd> <dt><a name="75">method <b class="cmd">clay GET</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></dt> <dd><p>Pull a chunk of data from the class's clay system. If no value is found, returns an empty string.</p></dd> <dt><a name="76">method <b class="cmd">clay merge</b> <i class="arg">dict</i> <span class="opt">?<b class="option">dict...</b>?</span></a></dt> <dd><p>Recursively merge the dictionaries given into the object's local clay storage.</p></dd> <dt><a name="77">method <b class="cmd">clay replace</b> <i class="arg">dictionary</i></a></dt> <dd><p>Replace the contents of the internal clay storage with the dictionary given.</p></dd> <dt><a name="78">method <b class="cmd">clay search</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></dt> <dd><p>Return the first matching value for the path in either this class's clay data or one of its ancestors</p></dd> <dt><a name="79">method <b class="cmd">clay set</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span> <i class="arg">value</i></a></dt> <dd><p>Merge the conents of <b class="const">value</b> with the object's clay storage at <b class="const">path</b>.</p></dd> </dl> </div> <div id="subsection5" class="doctools_subsection"><h3><a name="subsection5">Class clay::object</a></h3> <p>clay::object This class is inherited by all classes that have options.</p> <p><b class="class">Methods</b></p> <dl class="doctools_definitions"> <dt><a name="80">method <b class="cmd">clay ancestors</b></a></dt> <dd><p>Return the class this object belongs to, all classes mixed into this object, and all ancestors of those classes in search order.</p></dd> <dt><a name="81">method <b class="cmd">clay cache</b> <i class="arg">path</i> <i class="arg">value</i></a></dt> <dd><p>Store VALUE in such a way that request in SEARCH for PATH will always return it until the cache is flushed</p></dd> <dt><a name="82">method <b class="cmd">clay cget</b> <i class="arg">field</i></a></dt> <dd><p>Pull a value from either the object's clay structure or one of its constituent classes that matches the field name. The order of search us:</p> <p>1. The as a value in local dict variable config</p> <p>2. The as a value in local dict variable clay</p> <p>3. As a leaf in any ancestor as a root of the clay tree</p> <p>4. As a leaf in any ancestor as <b class="const">const</b> <em>field</em></p> <p>5. As a leaf in any ancestor as <b class="const">option</b> <em>field</em> <b class="const">default</b></p></dd> <dt><a name="83">method <b class="cmd">clay delegate</b> <span class="opt">?<i class="arg">stub</i>?</span> <span class="opt">?<i class="arg">object</i>?</span></a></dt> <dd><p>Introspect or control method delegation. With no arguments, the method will return a key/value list of stubs and objects. With just the <i class="arg">stub</i> argument, the method will return the object (if any) attached to the stub. With a <i class="arg">stub</i> and an <i class="arg">object</i> this command will forward all calls to the method <i class="arg">stub</i> to the <i class="arg">object</i>.</p></dd> <dt><a name="84">method <b class="cmd">clay dump</b></a></dt> <dd><p>Return a complete dump of this object's clay data, as well as the data from all constituent classes recursively blended in.</p></dd> <dt><a name="85">method <b class="cmd">clay ensemble_map</b></a></dt> <dd><p>Return a dictionary describing the method ensembles to be assembled for this object</p></dd> <dt><a name="86">method <b class="cmd">clay eval</b> <i class="arg">script</i></a></dt> <dd><p>Evaluated a script in the namespace of this object</p></dd> <dt><a name="87">method <b class="cmd">clay evolve</b></a></dt> <dd><p>Trigger the <b class="method">InitializePublic</b> private method</p></dd> <dt><a name="88">method <b class="cmd">clay exists</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></dt> <dd><p>Returns 1 if <em>path</em> exists in either the object's clay data. Values greater than one indicate the element exists in one of the object's constituent classes. A value of zero indicates the path could not be found.</p></dd> <dt><a name="89">method <b class="cmd">clay flush</b></a></dt> <dd><p>Wipe any caches built by the clay implementation</p></dd> <dt><a name="90">method <b class="cmd">clay forward</b> <i class="arg">method</i> <i class="arg">object</i></a></dt> <dd><p>A convenience wrapper for</p> <pre class="doctools_example">oo::objdefine [self] forward {*}$args</pre> </dd> <dt><a name="91">method <b class="cmd">clay get</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></dt> <dd><p>Pull a chunk of data from the clay system. If the last element of <em>path</em> is a branch (ends in a slash /), returns a recursive merge of all data from this object and it's constituent classes of the data in that branch. If the last element is a leaf, search this object for a matching leaf, or search all constituent classes for a matching leaf and return the first value found. If no value is found, returns an empty string.</p></dd> <dt><a name="92">method <b class="cmd">clay leaf</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></dt> <dd><p>A modified get which is tailored to pull only leaf elements</p></dd> <dt><a name="93">method <b class="cmd">clay merge</b> <i class="arg">dict</i> <span class="opt">?<b class="option">dict...</b>?</span></a></dt> <dd><p>Recursively merge the dictionaries given into the object's local clay storage.</p></dd> <dt><a name="94">method <b class="cmd">clay mixin</b> <i class="arg">class</i> <span class="opt">?<b class="option">class...</b>?</span></a></dt> <dd><p>Perform [oo::objdefine [self] mixin] on this object, with a few additional rules: Prior to the call, for any class was previously mixed in, but not in the new result, execute the script registered to mixin/ unmap-script (if given.) For all new classes, that were not present prior to this call, after the native TclOO mixin is invoked, execute the script registered to mixin/ map-script (if given.) Fall all classes that are now present and “mixed in”, execute the script registered to mixin/ react-script (if given.)</p></dd> <dt><a name="95">method <b class="cmd">clay mixinmap</b> <span class="opt">?<i class="arg">stub</i>?</span> <span class="opt">?<i class="arg">classes</i>?</span></a></dt> <dd><p>With no arguments returns the map of stubs and classes mixed into the current object. When only stub is given, returns the classes mixed in on that stub. When stub and classlist given, replace the classes currently on that stub with the given classes and invoke clay mixin on the new matrix of mixed in classes.</p></dd> <dt><a name="96">method <b class="cmd">clay provenance</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span></a></dt> <dd><p>Return either <b class="const">self</b> if that path exists in the current object, or return the first class (if any) along the clay search path which contains that element.</p></dd> <dt><a name="97">method <b class="cmd">clay replace</b> <i class="arg">dictionary</i></a></dt> <dd><p>Replace the contents of the internal clay storage with the dictionary given.</p></dd> <dt><a name="98">method <b class="cmd">clay search</b> <i class="arg">path</i> <i class="arg">valuevar</i> <i class="arg">isleafvar</i></a></dt> <dd><p>Return true, and set valuevar to the value and isleafar to true for false if PATH was found in the cache.</p></dd> <dt><a name="99">method <b class="cmd">clay source</b> <i class="arg">filename</i></a></dt> <dd><p>Source the given filename within the object's namespace</p></dd> <dt><a name="100">method <b class="cmd">clay set</b> <i class="arg">path</i> <span class="opt">?<b class="option">path...</b>?</span> <i class="arg">value</i></a></dt> <dd><p>Merge the conents of <b class="const">value</b> with the object's clay storage at <b class="const">path</b>.</p></dd> <dt><a name="101">method <b class="cmd">InitializePublic</b></a></dt> <dd><p>Instantiate variables. Called on object creation and during clay mixin.</p></dd> </dl> </div> </div> <div id="section4" class="doctools_section"><h2><a name="section4">AUTHORS</a></h2> <p>Sean Woods <a href="mailto:<[email protected]>">mailto:<[email protected]></a></p> </div> |
︙ | ︙ |
Changes to idoc/www/tcllib/files/modules/debug/debug_heartbeat.html.
︙ | ︙ | |||
103 104 105 106 107 108 109 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> | | | | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> <h1 class="doctools_title">debug::heartbeat(n) 1.0.1 tcllib "debug narrative"</h1> <div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> <p>debug::heartbeat - debug narrative - heartbeat</p> </div> <div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> <ul class="doctools_toc"> <li class="doctools_section"><a href="#toc">Table Of Contents</a></li> <li class="doctools_section"><a href="#synopsis">Synopsis</a></li> <li class="doctools_section"><a href="#section1">Description</a></li> <li class="doctools_section"><a href="#section2">API</a></li> <li class="doctools_section"><a href="#section3">Bugs, Ideas, Feedback</a></li> <li class="doctools_section"><a href="#keywords">Keywords</a></li> <li class="doctools_section"><a href="#category">Category</a></li> <li class="doctools_section"><a href="#copyright">Copyright</a></li> </ul> </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> <li>package require <b class="pkgname">Tcl 8.5</b></li> <li>package require <b class="pkgname">debug::heartbeat <span class="opt">?1.0.1?</span></b></li> <li>package require <b class="pkgname">debug <span class="opt">?1?</span></b></li> </ul> <ul class="doctools_syntax"> <li><a href="#1"><b class="cmd"><a href="debug.html">debug</a></b> <b class="method">heartbeat</b> <span class="opt">?<i class="arg">delta</i>?</span></a></li> </ul> </div> </div> |
︙ | ︙ |
Changes to idoc/www/tcllib/files/modules/dns/tcllib_dns.html.
︙ | ︙ | |||
103 104 105 106 107 108 109 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> | | | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> <h1 class="doctools_title">dns(n) 1.4.1 tcllib "Domain Name Service"</h1> <div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> <p>dns - Tcl Domain Name Service Client</p> </div> <div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> <ul class="doctools_toc"> <li class="doctools_section"><a href="#toc">Table Of Contents</a></li> <li class="doctools_section"><a href="#synopsis">Synopsis</a></li> |
︙ | ︙ | |||
127 128 129 130 131 132 133 | <li class="doctools_section"><a href="#copyright">Copyright</a></li> </ul> </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> <li>package require <b class="pkgname">Tcl 8.2</b></li> | | | 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | <li class="doctools_section"><a href="#copyright">Copyright</a></li> </ul> </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> <li>package require <b class="pkgname">Tcl 8.2</b></li> <li>package require <b class="pkgname">dns <span class="opt">?1.4.1?</span></b></li> </ul> <ul class="doctools_syntax"> <li><a href="#1"><b class="cmd">::dns::resolve</b> <i class="arg">query</i> <span class="opt">?<i class="arg">options</i>?</span></a></li> <li><a href="#2"><b class="cmd">::dns::configure</b> <span class="opt">?<i class="arg">options</i>?</span></a></li> <li><a href="#3"><b class="cmd">::dns::name</b> <i class="arg">token</i></a></li> <li><a href="#4"><b class="cmd">::dns::address</b> <i class="arg">token</i></a></li> <li><a href="#5"><b class="cmd">::dns::cname</b> <i class="arg">token</i></a></li> |
︙ | ︙ |
Changes to idoc/www/tcllib/files/modules/httpd/httpd.html.
︙ | ︙ | |||
103 104 105 106 107 108 109 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> | | | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> <h1 class="doctools_title">httpd(n) 4.3.4 tcllib "Tcl Web Server"</h1> <div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> <p>httpd - A TclOO and coroutine based web server</p> </div> <div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> <ul class="doctools_toc"> <li class="doctools_section"><a href="#toc">Table Of Contents</a></li> <li class="doctools_section"><a href="#synopsis">Synopsis</a></li> |
︙ | ︙ |
Changes to idoc/www/tcllib/files/modules/markdown/markdown.html.
︙ | ︙ | |||
101 102 103 104 105 106 107 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> | | | | 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> <h1 class="doctools_title">markdown(n) 1.1.1 tcllib "Markdown to HTML Converter"</h1> <div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> <p>markdown - Converts Markdown text to HTML</p> </div> <div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> <ul class="doctools_toc"> <li class="doctools_section"><a href="#toc">Table Of Contents</a></li> <li class="doctools_section"><a href="#synopsis">Synopsis</a></li> <li class="doctools_section"><a href="#section1">Description</a></li> <li class="doctools_section"><a href="#section2">Bugs, Ideas, Feedback</a></li> <li class="doctools_section"><a href="#category">Category</a></li> </ul> </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> <li>package require <b class="pkgname">Tcl 8.5</b></li> <li>package require <b class="pkgname">Markdown 1.1.1</b></li> <li>package require <b class="pkgname">textutil <span class="opt">?0.8?</span></b></li> </ul> <ul class="doctools_syntax"> <li><a href="#1"><b class="cmd">::Markdown::convert</b> <i class="arg">markdown</i></a></li> <li><a href="#2"><b class="cmd">::Markdown::register</b> <i class="arg">langspec</i> <i class="arg">converter</i></a></li> <li><a href="#3"><b class="cmd">::Markdown::get_lang_counter</b></a></li> <li><a href="#4"><b class="cmd">::Markdown::reset_lang_counter</b></a></li> |
︙ | ︙ |
Changes to idoc/www/tcllib/files/modules/math/math_geometry.html.
︙ | ︙ | |||
141 142 143 144 145 146 147 | <li><a href="#8"><b class="cmd">::math::geometry::h</b> <i class="arg">length</i></a></li> <li><a href="#9"><b class="cmd">::math::geometry::v</b> <i class="arg">length</i></a></li> <li><a href="#10"><b class="cmd">::math::geometry::between</b> <i class="arg">point1</i> <i class="arg">point2</i> <i class="arg">s</i></a></li> <li><a href="#11"><b class="cmd">::math::geometry::octant</b> <i class="arg">point</i></a></li> <li><a href="#12"><b class="cmd">::math::geometry::rect</b> <i class="arg">nw</i> <i class="arg">se</i></a></li> <li><a href="#13"><b class="cmd">::math::geometry::nwse</b> <i class="arg">rect</i></a></li> <li><a href="#14"><b class="cmd">::math::geometry::angle</b> <i class="arg">line</i></a></li> | > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | <li><a href="#8"><b class="cmd">::math::geometry::h</b> <i class="arg">length</i></a></li> <li><a href="#9"><b class="cmd">::math::geometry::v</b> <i class="arg">length</i></a></li> <li><a href="#10"><b class="cmd">::math::geometry::between</b> <i class="arg">point1</i> <i class="arg">point2</i> <i class="arg">s</i></a></li> <li><a href="#11"><b class="cmd">::math::geometry::octant</b> <i class="arg">point</i></a></li> <li><a href="#12"><b class="cmd">::math::geometry::rect</b> <i class="arg">nw</i> <i class="arg">se</i></a></li> <li><a href="#13"><b class="cmd">::math::geometry::nwse</b> <i class="arg">rect</i></a></li> <li><a href="#14"><b class="cmd">::math::geometry::angle</b> <i class="arg">line</i></a></li> <li><a href="#15"><b class="cmd">::math::geometry::angleBetween</b> <i class="arg">vector1</i> <i class="arg">vector2</i></a></li> <li><a href="#16"><b class="cmd">::math::geometry::inproduct</b> <i class="arg">vector1</i> <i class="arg">vector2</i></a></li> <li><a href="#17"><b class="cmd">::math::geometry::areaParallellogram</b> <i class="arg">vector1</i> <i class="arg">vector2</i></a></li> <li><a href="#18"><b class="cmd">::math::geometry::calculateDistanceToLine</b> <i class="arg">P</i> <i class="arg">line</i></a></li> <li><a href="#19"><b class="cmd">::math::geometry::calculateDistanceToLineSegment</b> <i class="arg">P</i> <i class="arg">linesegment</i></a></li> <li><a href="#20"><b class="cmd">::math::geometry::calculateDistanceToPolyline</b> <i class="arg">P</i> <i class="arg">polyline</i></a></li> <li><a href="#21"><b class="cmd">::math::geometry::calculateDistanceToPolygon</b> <i class="arg">P</i> <i class="arg">polygon</i></a></li> <li><a href="#22"><b class="cmd">::math::geometry::findClosestPointOnLine</b> <i class="arg">P</i> <i class="arg">line</i></a></li> <li><a href="#23"><b class="cmd">::math::geometry::findClosestPointOnLineSegment</b> <i class="arg">P</i> <i class="arg">linesegment</i></a></li> <li><a href="#24"><b class="cmd">::math::geometry::findClosestPointOnPolyline</b> <i class="arg">P</i> <i class="arg">polyline</i></a></li> <li><a href="#25"><b class="cmd">::math::geometry::lengthOfPolyline</b> <i class="arg">polyline</i></a></li> <li><a href="#26"><b class="cmd">::math::geometry::movePointInDirection</b> <i class="arg">P</i> <i class="arg">direction</i> <i class="arg">dist</i></a></li> <li><a href="#27"><b class="cmd">::math::geometry::lineSegmentsIntersect</b> <i class="arg">linesegment1</i> <i class="arg">linesegment2</i></a></li> <li><a href="#28"><b class="cmd">::math::geometry::findLineSegmentIntersection</b> <i class="arg">linesegment1</i> <i class="arg">linesegment2</i></a></li> <li><a href="#29"><b class="cmd">::math::geometry::findLineIntersection</b> <i class="arg">line1</i> <i class="arg">line2</i></a></li> <li><a href="#30"><b class="cmd">::math::geometry::polylinesIntersect</b> <i class="arg">polyline1</i> <i class="arg">polyline2</i></a></li> <li><a href="#31"><b class="cmd">::math::geometry::polylinesBoundingIntersect</b> <i class="arg">polyline1</i> <i class="arg">polyline2</i> <i class="arg">granularity</i></a></li> <li><a href="#32"><b class="cmd">::math::geometry::intervalsOverlap</b> <i class="arg">y1</i> <i class="arg">y2</i> <i class="arg">y3</i> <i class="arg">y4</i> <i class="arg">strict</i></a></li> <li><a href="#33"><b class="cmd">::math::geometry::rectanglesOverlap</b> <i class="arg">P1</i> <i class="arg">P2</i> <i class="arg">Q1</i> <i class="arg">Q2</i> <i class="arg">strict</i></a></li> <li><a href="#34"><b class="cmd">::math::geometry::bbox</b> <i class="arg">polyline</i></a></li> <li><a href="#35"><b class="cmd">::math::geometry::pointInsidePolygon</b> <i class="arg">P</i> <i class="arg">polyline</i></a></li> <li><a href="#36"><b class="cmd">::math::geometry::pointInsidePolygonAlt</b> <i class="arg">P</i> <i class="arg">polyline</i></a></li> <li><a href="#37"><b class="cmd">::math::geometry::rectangleInsidePolygon</b> <i class="arg">P1</i> <i class="arg">P2</i> <i class="arg">polyline</i></a></li> <li><a href="#38"><b class="cmd">::math::geometry::areaPolygon</b> <i class="arg">polygon</i></a></li> <li><a href="#39"><b class="cmd">::math::geometry::translate</b> <i class="arg">vector</i> <i class="arg">polyline</i></a></li> <li><a href="#40"><b class="cmd">::math::geometry::rotate</b> <i class="arg">angle</i> <i class="arg">polyline</i></a></li> <li><a href="#41"><b class="cmd">::math::geometry::reflect</b> <i class="arg">angle</i> <i class="arg">polyline</i></a></li> <li><a href="#42"><b class="cmd">::math::geometry::degToRad</b> <i class="arg">angle</i></a></li> <li><a href="#43"><b class="cmd">::math::geometry::radToDeg</b> <i class="arg">angle</i></a></li> <li><a href="#44"><b class="cmd">::math::geometry::circle</b> <i class="arg">centre</i> <i class="arg">radius</i></a></li> <li><a href="#45"><b class="cmd">::math::geometry::circleTwoPoints</b> <i class="arg">point1</i> <i class="arg">point2</i></a></li> <li><a href="#46"><b class="cmd">::math::geometry::pointInsideCircle</b> <i class="arg">point</i> <i class="arg">circle</i></a></li> <li><a href="#47"><b class="cmd">::math::geometry::lineIntersectsCircle</b> <i class="arg">line</i> <i class="arg">circle</i></a></li> <li><a href="#48"><b class="cmd">::math::geometry::lineSegmentIntersectsCircle</b> <i class="arg">segment</i> <i class="arg">circle</i></a></li> <li><a href="#49"><b class="cmd">::math::geometry::intersectionLineWithCircle</b> <i class="arg">line</i> <i class="arg">circle</i></a></li> <li><a href="#50"><b class="cmd">::math::geometry::intersectionCircleWithCircle</b> <i class="arg">circle1</i> <i class="arg">circle2</i></a></li> <li><a href="#51"><b class="cmd">::math::geometry::tangentLinesToCircle</b> <i class="arg">point</i> <i class="arg">circle</i></a></li> </ul> </div> </div> <div id="section1" class="doctools_section"><h2><a name="section1">Description</a></h2> <p>The <b class="package">math::geometry</b> package is a collection of functions for computations and manipulations on two-dimensional geometrical objects, such as points, lines and polygons.</p> |
︙ | ︙ | |||
279 280 281 282 283 284 285 | <dt><a name="14"><b class="cmd">::math::geometry::angle</b> <i class="arg">line</i></a></dt> <dd><p>Calculate the angle from the positive x-axis to a given line (in two dimensions only).</p> <dl class="doctools_arguments"> <dt>list <i class="arg">line</i></dt> <dd><p>Coordinates of the line</p></dd> </dl></dd> | > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 | <dt><a name="14"><b class="cmd">::math::geometry::angle</b> <i class="arg">line</i></a></dt> <dd><p>Calculate the angle from the positive x-axis to a given line (in two dimensions only).</p> <dl class="doctools_arguments"> <dt>list <i class="arg">line</i></dt> <dd><p>Coordinates of the line</p></dd> </dl></dd> <dt><a name="15"><b class="cmd">::math::geometry::angleBetween</b> <i class="arg">vector1</i> <i class="arg">vector2</i></a></dt> <dd><p>Calculate the angle between two vectors (in degrees)</p> <dl class="doctools_arguments"> <dt>list <i class="arg">vector1</i></dt> <dd><p>First vector</p></dd> <dt>list <i class="arg">vector2</i></dt> <dd><p>Second vector</p></dd> </dl></dd> <dt><a name="16"><b class="cmd">::math::geometry::inproduct</b> <i class="arg">vector1</i> <i class="arg">vector2</i></a></dt> <dd><p>Calculate the inner product of two vectors</p> <dl class="doctools_arguments"> <dt>list <i class="arg">vector1</i></dt> <dd><p>First vector</p></dd> <dt>list <i class="arg">vector2</i></dt> <dd><p>Second vector</p></dd> </dl></dd> <dt><a name="17"><b class="cmd">::math::geometry::areaParallellogram</b> <i class="arg">vector1</i> <i class="arg">vector2</i></a></dt> <dd><p>Calculate the area of the parallellogram with the two vectors as its sides</p> <dl class="doctools_arguments"> <dt>list <i class="arg">vector1</i></dt> <dd><p>First vector</p></dd> <dt>list <i class="arg">vector2</i></dt> <dd><p>Second vector</p></dd> </dl></dd> <dt><a name="18"><b class="cmd">::math::geometry::calculateDistanceToLine</b> <i class="arg">P</i> <i class="arg">line</i></a></dt> <dd><p>Calculate the distance of point P to the (infinite) line and return the result</p> <dl class="doctools_arguments"> <dt>list <i class="arg">P</i></dt> <dd><p>List of two numbers, the coordinates of the point</p></dd> <dt>list <i class="arg">line</i></dt> <dd><p>List of four numbers, the coordinates of two points on the line</p></dd> </dl></dd> <dt><a name="19"><b class="cmd">::math::geometry::calculateDistanceToLineSegment</b> <i class="arg">P</i> <i class="arg">linesegment</i></a></dt> <dd><p>Calculate the distance of point P to the (finite) line segment and return the result.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">P</i></dt> <dd><p>List of two numbers, the coordinates of the point</p></dd> <dt>list <i class="arg">linesegment</i></dt> <dd><p>List of four numbers, the coordinates of the first and last points of the line segment</p></dd> </dl></dd> <dt><a name="20"><b class="cmd">::math::geometry::calculateDistanceToPolyline</b> <i class="arg">P</i> <i class="arg">polyline</i></a></dt> <dd><p>Calculate the distance of point P to the polyline and return the result. Note that a polyline needs not to be closed.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">P</i></dt> <dd><p>List of two numbers, the coordinates of the point</p></dd> <dt>list <i class="arg">polyline</i></dt> <dd><p>List of numbers, the coordinates of the vertices of the polyline</p></dd> </dl></dd> <dt><a name="21"><b class="cmd">::math::geometry::calculateDistanceToPolygon</b> <i class="arg">P</i> <i class="arg">polygon</i></a></dt> <dd><p>Calculate the distance of point P to the polygon and return the result. If the list of coordinates is not closed (first and last points differ), it is automatically closed.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">P</i></dt> <dd><p>List of two numbers, the coordinates of the point</p></dd> <dt>list <i class="arg">polygon</i></dt> <dd><p>List of numbers, the coordinates of the vertices of the polygon</p></dd> </dl></dd> <dt><a name="22"><b class="cmd">::math::geometry::findClosestPointOnLine</b> <i class="arg">P</i> <i class="arg">line</i></a></dt> <dd><p>Return the point on a line which is closest to a given point.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">P</i></dt> <dd><p>List of two numbers, the coordinates of the point</p></dd> <dt>list <i class="arg">line</i></dt> <dd><p>List of four numbers, the coordinates of two points on the line</p></dd> </dl></dd> <dt><a name="23"><b class="cmd">::math::geometry::findClosestPointOnLineSegment</b> <i class="arg">P</i> <i class="arg">linesegment</i></a></dt> <dd><p>Return the point on a <em>line segment</em> which is closest to a given point.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">P</i></dt> <dd><p>List of two numbers, the coordinates of the point</p></dd> <dt>list <i class="arg">linesegment</i></dt> <dd><p>List of four numbers, the first and last points on the line segment</p></dd> </dl></dd> <dt><a name="24"><b class="cmd">::math::geometry::findClosestPointOnPolyline</b> <i class="arg">P</i> <i class="arg">polyline</i></a></dt> <dd><p>Return the point on a <em>polyline</em> which is closest to a given point.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">P</i></dt> <dd><p>List of two numbers, the coordinates of the point</p></dd> <dt>list <i class="arg">polyline</i></dt> <dd><p>List of numbers, the vertices of the polyline</p></dd> </dl></dd> <dt><a name="25"><b class="cmd">::math::geometry::lengthOfPolyline</b> <i class="arg">polyline</i></a></dt> <dd><p>Return the length of the <em>polyline</em> (note: it not regarded as a polygon)</p> <dl class="doctools_arguments"> <dt>list <i class="arg">polyline</i></dt> <dd><p>List of numbers, the vertices of the polyline</p></dd> </dl></dd> <dt><a name="26"><b class="cmd">::math::geometry::movePointInDirection</b> <i class="arg">P</i> <i class="arg">direction</i> <i class="arg">dist</i></a></dt> <dd><p>Move a point over a given distance in a given direction and return the new coordinates (in two dimensions only).</p> <dl class="doctools_arguments"> <dt>list <i class="arg">P</i></dt> <dd><p>Coordinates of the point to be moved</p></dd> <dt>double <i class="arg">direction</i></dt> <dd><p>Direction (in degrees; 0 is to the right, 90 upwards)</p></dd> <dt>list <i class="arg">dist</i></dt> <dd><p>Distance over which to move the point</p></dd> </dl></dd> <dt><a name="27"><b class="cmd">::math::geometry::lineSegmentsIntersect</b> <i class="arg">linesegment1</i> <i class="arg">linesegment2</i></a></dt> <dd><p>Check if two line segments intersect or coincide. Returns 1 if that is the case, 0 otherwise (in two dimensions only). If an endpoint of one segment lies on the other segment (or is very close to the segment), they are considered to intersect</p> <dl class="doctools_arguments"> <dt>list <i class="arg">linesegment1</i></dt> <dd><p>First line segment</p></dd> <dt>list <i class="arg">linesegment2</i></dt> <dd><p>Second line segment</p></dd> </dl></dd> <dt><a name="28"><b class="cmd">::math::geometry::findLineSegmentIntersection</b> <i class="arg">linesegment1</i> <i class="arg">linesegment2</i></a></dt> <dd><p>Find the intersection point of two line segments. Return the coordinates or the keywords "coincident" or "none" if the line segments coincide or have no points in common (in two dimensions only).</p> <dl class="doctools_arguments"> <dt>list <i class="arg">linesegment1</i></dt> <dd><p>First line segment</p></dd> <dt>list <i class="arg">linesegment2</i></dt> <dd><p>Second line segment</p></dd> </dl></dd> <dt><a name="29"><b class="cmd">::math::geometry::findLineIntersection</b> <i class="arg">line1</i> <i class="arg">line2</i></a></dt> <dd><p>Find the intersection point of two (infinite) lines. Return the coordinates or the keywords "coincident" or "none" if the lines coincide or have no points in common (in two dimensions only).</p> <dl class="doctools_arguments"> <dt>list <i class="arg">line1</i></dt> <dd><p>First line</p></dd> <dt>list <i class="arg">line2</i></dt> <dd><p>Second line</p></dd> </dl> <p>See section <span class="sectref"><a href="#section3">References</a></span> for details on the algorithm and math behind it.</p></dd> <dt><a name="30"><b class="cmd">::math::geometry::polylinesIntersect</b> <i class="arg">polyline1</i> <i class="arg">polyline2</i></a></dt> <dd><p>Check if two polylines intersect or not (in two dimensions only).</p> <dl class="doctools_arguments"> <dt>list <i class="arg">polyline1</i></dt> <dd><p>First polyline</p></dd> <dt>list <i class="arg">polyline2</i></dt> <dd><p>Second polyline</p></dd> </dl></dd> <dt><a name="31"><b class="cmd">::math::geometry::polylinesBoundingIntersect</b> <i class="arg">polyline1</i> <i class="arg">polyline2</i> <i class="arg">granularity</i></a></dt> <dd><p>Check whether two polylines intersect, but reduce the correctness of the result to the given granularity. Use this for faster, but weaker, intersection checking.</p> <p>How it works:</p> <p>Each polyline is split into a number of smaller polylines, consisting of granularity points each. If a pair of those smaller lines' bounding boxes intersect, then this procedure returns 1, otherwise it returns 0.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">polyline1</i></dt> <dd><p>First polyline</p></dd> <dt>list <i class="arg">polyline2</i></dt> <dd><p>Second polyline</p></dd> <dt>int <i class="arg">granularity</i></dt> <dd><p>Number of points in each part (<=1 means check every edge)</p></dd> </dl></dd> <dt><a name="32"><b class="cmd">::math::geometry::intervalsOverlap</b> <i class="arg">y1</i> <i class="arg">y2</i> <i class="arg">y3</i> <i class="arg">y4</i> <i class="arg">strict</i></a></dt> <dd><p>Check if two intervals overlap.</p> <dl class="doctools_arguments"> <dt>double <i class="arg">y1,y2</i></dt> <dd><p>Begin and end of first interval</p></dd> <dt>double <i class="arg">y3,y4</i></dt> <dd><p>Begin and end of second interval</p></dd> <dt>logical <i class="arg">strict</i></dt> <dd><p>Check for strict or non-strict overlap</p></dd> </dl></dd> <dt><a name="33"><b class="cmd">::math::geometry::rectanglesOverlap</b> <i class="arg">P1</i> <i class="arg">P2</i> <i class="arg">Q1</i> <i class="arg">Q2</i> <i class="arg">strict</i></a></dt> <dd><p>Check if two rectangles overlap.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">P1</i></dt> <dd><p>upper-left corner of the first rectangle</p></dd> <dt>list <i class="arg">P2</i></dt> <dd><p>lower-right corner of the first rectangle</p></dd> <dt>list <i class="arg">Q1</i></dt> <dd><p>upper-left corner of the second rectangle</p></dd> <dt>list <i class="arg">Q2</i></dt> <dd><p>lower-right corner of the second rectangle</p></dd> <dt>list <i class="arg">strict</i></dt> <dd><p>choosing strict or non-strict interpretation</p></dd> </dl></dd> <dt><a name="34"><b class="cmd">::math::geometry::bbox</b> <i class="arg">polyline</i></a></dt> <dd><p>Calculate the bounding box of a polyline. Returns a list of four coordinates: the upper-left and the lower-right corner of the box.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">polyline</i></dt> <dd><p>The polyline to be examined</p></dd> </dl></dd> <dt><a name="35"><b class="cmd">::math::geometry::pointInsidePolygon</b> <i class="arg">P</i> <i class="arg">polyline</i></a></dt> <dd><p>Determine if a point is completely inside a polygon. If the point touches the polygon, then the point is not completely inside the polygon.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">P</i></dt> <dd><p>Coordinates of the point</p></dd> <dt>list <i class="arg">polyline</i></dt> <dd><p>The polyline to be examined</p></dd> </dl></dd> <dt><a name="36"><b class="cmd">::math::geometry::pointInsidePolygonAlt</b> <i class="arg">P</i> <i class="arg">polyline</i></a></dt> <dd><p>Determine if a point is completely inside a polygon. If the point touches the polygon, then the point is not completely inside the polygon. <em>Note:</em> this alternative procedure uses the so-called winding number to determine this. It handles self-intersecting polygons in a "natural" way.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">P</i></dt> <dd><p>Coordinates of the point</p></dd> <dt>list <i class="arg">polyline</i></dt> <dd><p>The polyline to be examined</p></dd> </dl></dd> <dt><a name="37"><b class="cmd">::math::geometry::rectangleInsidePolygon</b> <i class="arg">P1</i> <i class="arg">P2</i> <i class="arg">polyline</i></a></dt> <dd><p>Determine if a rectangle is completely inside a polygon. If polygon touches the rectangle, then the rectangle is not complete inside the polygon.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">P1</i></dt> <dd><p>Upper-left corner of the rectangle</p></dd> <dt>list <i class="arg">P2</i></dt> <dd><p>Lower-right corner of the rectangle</p></dd> <dt>list <i class="arg">polygon</i></dt> <dd><p>The polygon in question</p></dd> </dl></dd> <dt><a name="38"><b class="cmd">::math::geometry::areaPolygon</b> <i class="arg">polygon</i></a></dt> <dd><p>Calculate the area of a polygon.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">polygon</i></dt> <dd><p>The polygon in question</p></dd> </dl></dd> <dt><a name="39"><b class="cmd">::math::geometry::translate</b> <i class="arg">vector</i> <i class="arg">polyline</i></a></dt> <dd><p>Translate a polyline over a given vector</p> <dl class="doctools_arguments"> <dt>list <i class="arg">vector</i></dt> <dd><p>Translation vector</p></dd> <dt>list <i class="arg">polyline</i></dt> <dd><p>The polyline to be translated</p></dd> </dl></dd> <dt><a name="40"><b class="cmd">::math::geometry::rotate</b> <i class="arg">angle</i> <i class="arg">polyline</i></a></dt> <dd><p>Rotate a polyline over a given angle (degrees) around the origin</p> <dl class="doctools_arguments"> <dt>list <i class="arg">angle</i></dt> <dd><p>Angle over which to rotate the polyline (degrees)</p></dd> <dt>list <i class="arg">polyline</i></dt> <dd><p>The polyline to be rotated</p></dd> </dl></dd> <dt><a name="41"><b class="cmd">::math::geometry::reflect</b> <i class="arg">angle</i> <i class="arg">polyline</i></a></dt> <dd><p>Reflect a polyline in a line through the origin at a given angle (degrees) to the x-axis</p> <dl class="doctools_arguments"> <dt>list <i class="arg">angle</i></dt> <dd><p>Angle of the line of reflection (degrees)</p></dd> <dt>list <i class="arg">polyline</i></dt> <dd><p>The polyline to be reflected</p></dd> </dl></dd> <dt><a name="42"><b class="cmd">::math::geometry::degToRad</b> <i class="arg">angle</i></a></dt> <dd><p>Convert from degrees to radians</p> <dl class="doctools_arguments"> <dt>list <i class="arg">angle</i></dt> <dd><p>Angle in degrees</p></dd> </dl></dd> <dt><a name="43"><b class="cmd">::math::geometry::radToDeg</b> <i class="arg">angle</i></a></dt> <dd><p>Convert from radians to degrees</p> <dl class="doctools_arguments"> <dt>list <i class="arg">angle</i></dt> <dd><p>Angle in radians</p></dd> </dl></dd> <dt><a name="44"><b class="cmd">::math::geometry::circle</b> <i class="arg">centre</i> <i class="arg">radius</i></a></dt> <dd><p>Convenience procedure to create a circle from a point and a radius.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">centre</i></dt> <dd><p>Coordinates of the circle centre</p></dd> <dt>list <i class="arg">radius</i></dt> <dd><p>Radius of the circle</p></dd> </dl></dd> <dt><a name="45"><b class="cmd">::math::geometry::circleTwoPoints</b> <i class="arg">point1</i> <i class="arg">point2</i></a></dt> <dd><p>Convenience procedure to create a circle from two points on its circumference The centre is the point between the two given points, the radius is half the distance between them.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">point1</i></dt> <dd><p>First point</p></dd> <dt>list <i class="arg">point2</i></dt> <dd><p>Second point</p></dd> </dl></dd> <dt><a name="46"><b class="cmd">::math::geometry::pointInsideCircle</b> <i class="arg">point</i> <i class="arg">circle</i></a></dt> <dd><p>Determine if the given point is inside the circle or on the circumference (1) or outside (0).</p> <dl class="doctools_arguments"> <dt>list <i class="arg">point</i></dt> <dd><p>Point to be checked</p></dd> <dt>list <i class="arg">circle</i></dt> <dd><p>Circle that may or may not contain the point</p></dd> </dl></dd> <dt><a name="47"><b class="cmd">::math::geometry::lineIntersectsCircle</b> <i class="arg">line</i> <i class="arg">circle</i></a></dt> <dd><p>Determine if the given line intersects the circle or touches it (1) or does not (0).</p> <dl class="doctools_arguments"> <dt>list <i class="arg">line</i></dt> <dd><p>Line to be checked</p></dd> <dt>list <i class="arg">circle</i></dt> <dd><p>Circle that may or may not be intersected</p></dd> </dl></dd> <dt><a name="48"><b class="cmd">::math::geometry::lineSegmentIntersectsCircle</b> <i class="arg">segment</i> <i class="arg">circle</i></a></dt> <dd><p>Determine if the given line segment intersects the circle or touches it (1) or does not (0).</p> <dl class="doctools_arguments"> <dt>list <i class="arg">segment</i></dt> <dd><p>Line segment to be checked</p></dd> <dt>list <i class="arg">circle</i></dt> <dd><p>Circle that may or may not be intersected</p></dd> </dl></dd> <dt><a name="49"><b class="cmd">::math::geometry::intersectionLineWithCircle</b> <i class="arg">line</i> <i class="arg">circle</i></a></dt> <dd><p>Determine the points at which the given line intersects the circle. There can be zero, one or two points. (If the line touches the circle or is close to it, then one point is returned. An arbitrary margin of 1.0e-10 times the radius is used to determine this situation.)</p> <dl class="doctools_arguments"> <dt>list <i class="arg">line</i></dt> <dd><p>Line to be checked</p></dd> <dt>list <i class="arg">circle</i></dt> <dd><p>Circle that may or may not be intersected</p></dd> </dl></dd> <dt><a name="50"><b class="cmd">::math::geometry::intersectionCircleWithCircle</b> <i class="arg">circle1</i> <i class="arg">circle2</i></a></dt> <dd><p>Determine the points at which the given two circles intersect. There can be zero, one or two points. (If the two circles touch the circle or are very close, then one point is returned. An arbitrary margin of 1.0e-10 times the mean of the radii of the two circles is used to determine this situation.)</p> <dl class="doctools_arguments"> <dt>list <i class="arg">circle1</i></dt> <dd><p>First circle</p></dd> <dt>list <i class="arg">circle2</i></dt> <dd><p>Second circle</p></dd> </dl></dd> <dt><a name="51"><b class="cmd">::math::geometry::tangentLinesToCircle</b> <i class="arg">point</i> <i class="arg">circle</i></a></dt> <dd><p>Determine the tangent lines from the given point to the circle. There can be zero, one or two lines. (If the point is on the cirucmference or very close to the circle, then one line is returned. An arbitrary margin of 1.0e-10 times the radius of the circle is used to determine this situation.)</p> <dl class="doctools_arguments"> <dt>list <i class="arg">point</i></dt> <dd><p>Point in question</p></dd> |
︙ | ︙ |
Changes to idoc/www/tcllib/files/modules/math/special.html.
︙ | ︙ | |||
103 104 105 106 107 108 109 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> | | | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> <h1 class="doctools_title">math::special(n) 0.4 tcllib "Tcl Math Library"</h1> <div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> <p>math::special - Special mathematical functions</p> </div> <div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> <ul class="doctools_toc"> <li class="doctools_section"><a href="#toc">Table Of Contents</a></li> <li class="doctools_section"><a href="#synopsis">Synopsis</a></li> |
︙ | ︙ | |||
125 126 127 128 129 130 131 | <li class="doctools_section"><a href="#category">Category</a></li> <li class="doctools_section"><a href="#copyright">Copyright</a></li> </ul> </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > | | | 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | <li class="doctools_section"><a href="#category">Category</a></li> <li class="doctools_section"><a href="#copyright">Copyright</a></li> </ul> </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> <li>package require <b class="pkgname">Tcl <span class="opt">?8.5?</span></b></li> <li>package require <b class="pkgname">math::special <span class="opt">?0.4?</span></b></li> </ul> <ul class="doctools_syntax"> <li><a href="#1"><b class="cmd">::math::special::Beta</b> <i class="arg">x</i> <i class="arg">y</i></a></li> <li><a href="#2"><b class="cmd">::math::special::incBeta</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">x</i></a></li> <li><a href="#3"><b class="cmd">::math::special::regIncBeta</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">x</i></a></li> <li><a href="#4"><b class="cmd">::math::special::Gamma</b> <i class="arg">x</i></a></li> <li><a href="#5"><b class="cmd">::math::special::digamma</b> <i class="arg">x</i></a></li> <li><a href="#6"><b class="cmd">::math::special::erf</b> <i class="arg">x</i></a></li> <li><a href="#7"><b class="cmd">::math::special::erfc</b> <i class="arg">x</i></a></li> <li><a href="#8"><b class="cmd">::math::special::invnorm</b> <i class="arg">p</i></a></li> <li><a href="#9"><b class="cmd">::math::special::J0</b> <i class="arg">x</i></a></li> <li><a href="#10"><b class="cmd">::math::special::J1</b> <i class="arg">x</i></a></li> <li><a href="#11"><b class="cmd">::math::special::Jn</b> <i class="arg">n</i> <i class="arg">x</i></a></li> <li><a href="#12"><b class="cmd">::math::special::J1/2</b> <i class="arg">x</i></a></li> <li><a href="#13"><b class="cmd">::math::special::J-1/2</b> <i class="arg">x</i></a></li> <li><a href="#14"><b class="cmd">::math::special::I_n</b> <i class="arg">x</i></a></li> <li><a href="#15"><b class="cmd">::math::special::cn</b> <i class="arg">u</i> <i class="arg">k</i></a></li> <li><a href="#16"><b class="cmd">::math::special::dn</b> <i class="arg">u</i> <i class="arg">k</i></a></li> <li><a href="#17"><b class="cmd">::math::special::sn</b> <i class="arg">u</i> <i class="arg">k</i></a></li> <li><a href="#18"><b class="cmd">::math::special::elliptic_K</b> <i class="arg">k</i></a></li> <li><a href="#19"><b class="cmd">::math::special::elliptic_E</b> <i class="arg">k</i></a></li> <li><a href="#20"><b class="cmd">::math::special::exponential_Ei</b> <i class="arg">x</i></a></li> <li><a href="#21"><b class="cmd">::math::special::exponential_En</b> <i class="arg">n</i> <i class="arg">x</i></a></li> <li><a href="#22"><b class="cmd">::math::special::exponential_li</b> <i class="arg">x</i></a></li> <li><a href="#23"><b class="cmd">::math::special::exponential_Ci</b> <i class="arg">x</i></a></li> <li><a href="#24"><b class="cmd">::math::special::exponential_Si</b> <i class="arg">x</i></a></li> <li><a href="#25"><b class="cmd">::math::special::exponential_Chi</b> <i class="arg">x</i></a></li> <li><a href="#26"><b class="cmd">::math::special::exponential_Shi</b> <i class="arg">x</i></a></li> <li><a href="#27"><b class="cmd">::math::special::fresnel_C</b> <i class="arg">x</i></a></li> <li><a href="#28"><b class="cmd">::math::special::fresnel_S</b> <i class="arg">x</i></a></li> <li><a href="#29"><b class="cmd">::math::special::sinc</b> <i class="arg">x</i></a></li> <li><a href="#30"><b class="cmd">::math::special::legendre</b> <i class="arg">n</i></a></li> <li><a href="#31"><b class="cmd">::math::special::chebyshev</b> <i class="arg">n</i></a></li> <li><a href="#32"><b class="cmd">::math::special::laguerre</b> <i class="arg">alpha</i> <i class="arg">n</i></a></li> <li><a href="#33"><b class="cmd">::math::special::hermite</b> <i class="arg">n</i></a></li> </ul> </div> </div> <div id="section1" class="doctools_section"><h2><a name="section1">Description</a></h2> <p>This package implements several so-called special functions, like the Gamma function, the Bessel functions and such.</p> <p>Each function is implemented by a procedure that bears its name (well, |
︙ | ︙ | |||
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | | | | | Fresnel | C | all of R | -- | < 2.0e-3 integrals | S | all of R | -- | < 2.0e-3 | | | | general | Beta | (see Gamma) | -- | < 1.0e-9 | Gamma | x != 0,-1, | -- | < 1.0e-9 | | -2, ... | | | sinc | all of R | -- | exact | | | | orthogonal | Legendre | all of R | n = 0,1,... | exact polynomials | Chebyshev | all of R | n = 0,1,... | exact | Laguerre | all of R | n = 0,1,... | exact | | | alpha el. R | | Hermite | all of R | n = 0,1,... | exact </pre> <p><em>Note:</em> Some of the error bounds are estimated, as no "formal" bounds were available with the implemented approximation method, others hold for the auxiliary functions used for estimating the primary functions.</p> <p>The following well-known functions are currently missing from the package:</p> <ul class="doctools_itemized"> <li><p>Bessel functions of the second kind (Y_n, K_n)</p></li> <li><p>Bessel functions of arbitrary order (and hence the Airy functions)</p></li> <li><p>Chebyshev polynomials of the second kind (U_n)</p></li> | > > > > > < | > > > > > > > > > > > > > > > > > > > > | > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 | | | | | Fresnel | C | all of R | -- | < 2.0e-3 integrals | S | all of R | -- | < 2.0e-3 | | | | general | Beta | (see Gamma) | -- | < 1.0e-9 | Gamma | x != 0,-1, | -- | < 1.0e-9 | | -2, ... | | | incBeta | | a, b > 0 | < 1.0e-9 | regIncBeta | | a, b > 0 | < 1.0e-9 | digamma | x != 0,-1 | | < 1.0e-9 | | -2, ... | | | | | | | sinc | all of R | -- | exact | | | | orthogonal | Legendre | all of R | n = 0,1,... | exact polynomials | Chebyshev | all of R | n = 0,1,... | exact | Laguerre | all of R | n = 0,1,... | exact | | | alpha el. R | | Hermite | all of R | n = 0,1,... | exact </pre> <p><em>Note:</em> Some of the error bounds are estimated, as no "formal" bounds were available with the implemented approximation method, others hold for the auxiliary functions used for estimating the primary functions.</p> <p>The following well-known functions are currently missing from the package:</p> <ul class="doctools_itemized"> <li><p>Bessel functions of the second kind (Y_n, K_n)</p></li> <li><p>Bessel functions of arbitrary order (and hence the Airy functions)</p></li> <li><p>Chebyshev polynomials of the second kind (U_n)</p></li> <li><p>The incomplete gamma function</p></li> </ul> </div> <div id="section3" class="doctools_section"><h2><a name="section3">PROCEDURES</a></h2> <p>The package defines the following public procedures:</p> <dl class="doctools_definitions"> <dt><a name="1"><b class="cmd">::math::special::Beta</b> <i class="arg">x</i> <i class="arg">y</i></a></dt> <dd><p>Compute the Beta function for arguments "x" and "y"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>First argument for the Beta function</p></dd> <dt>float <i class="arg">y</i></dt> <dd><p>Second argument for the Beta function</p></dd> </dl></dd> <dt><a name="2"><b class="cmd">::math::special::incBeta</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">x</i></a></dt> <dd><p>Compute the incomplete Beta function for argument "x" with parameters "a" and "b"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">a</i></dt> <dd><p>First parameter for the incomplete Beta function, a > 0</p></dd> <dt>float <i class="arg">b</i></dt> <dd><p>Second parameter for the incomplete Beta function, b > 0</p></dd> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the incomplete Beta function</p></dd> </dl></dd> <dt><a name="3"><b class="cmd">::math::special::regIncBeta</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">x</i></a></dt> <dd><p>Compute the regularized incomplete Beta function for argument "x" with parameters "a" and "b"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">a</i></dt> <dd><p>First parameter for the incomplete Beta function, a > 0</p></dd> <dt>float <i class="arg">b</i></dt> <dd><p>Second parameter for the incomplete Beta function, b > 0</p></dd> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the regularized incomplete Beta function</p></dd> </dl></dd> <dt><a name="4"><b class="cmd">::math::special::Gamma</b> <i class="arg">x</i></a></dt> <dd><p>Compute the Gamma function for argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the Gamma function</p></dd> </dl></dd> <dt><a name="5"><b class="cmd">::math::special::digamma</b> <i class="arg">x</i></a></dt> <dd><p>Compute the digamma function (psi) for argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the digamma function</p></dd> </dl></dd> <dt><a name="6"><b class="cmd">::math::special::erf</b> <i class="arg">x</i></a></dt> <dd><p>Compute the error function for argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the error function</p></dd> </dl></dd> <dt><a name="7"><b class="cmd">::math::special::erfc</b> <i class="arg">x</i></a></dt> <dd><p>Compute the complementary error function for argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the complementary error function</p></dd> </dl></dd> <dt><a name="8"><b class="cmd">::math::special::invnorm</b> <i class="arg">p</i></a></dt> <dd><p>Compute the inverse of the normal distribution function for argument "p"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">p</i></dt> <dd><p>Argument for the inverse normal distribution function (p must be greater than 0 and lower than 1)</p></dd> </dl></dd> <dt><a name="9"><b class="cmd">::math::special::J0</b> <i class="arg">x</i></a></dt> <dd><p>Compute the zeroth-order Bessel function of the first kind for the argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the Bessel function</p></dd> </dl></dd> <dt><a name="10"><b class="cmd">::math::special::J1</b> <i class="arg">x</i></a></dt> <dd><p>Compute the first-order Bessel function of the first kind for the argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the Bessel function</p></dd> </dl></dd> <dt><a name="11"><b class="cmd">::math::special::Jn</b> <i class="arg">n</i> <i class="arg">x</i></a></dt> <dd><p>Compute the nth-order Bessel function of the first kind for the argument "x"</p> <dl class="doctools_arguments"> <dt>integer <i class="arg">n</i></dt> <dd><p>Order of the Bessel function</p></dd> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the Bessel function</p></dd> </dl></dd> <dt><a name="12"><b class="cmd">::math::special::J1/2</b> <i class="arg">x</i></a></dt> <dd><p>Compute the half-order Bessel function of the first kind for the argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the Bessel function</p></dd> </dl></dd> <dt><a name="13"><b class="cmd">::math::special::J-1/2</b> <i class="arg">x</i></a></dt> <dd><p>Compute the minus-half-order Bessel function of the first kind for the argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the Bessel function</p></dd> </dl></dd> <dt><a name="14"><b class="cmd">::math::special::I_n</b> <i class="arg">x</i></a></dt> <dd><p>Compute the modified Bessel function of the first kind of order n for the argument "x"</p> <dl class="doctools_arguments"> <dt>int <i class="arg">x</i></dt> <dd><p>Positive integer order of the function</p></dd> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the function</p></dd> </dl></dd> <dt><a name="15"><b class="cmd">::math::special::cn</b> <i class="arg">u</i> <i class="arg">k</i></a></dt> <dd><p>Compute the elliptic function <em>cn</em> for the argument "u" and parameter "k".</p> <dl class="doctools_arguments"> <dt>float <i class="arg">u</i></dt> <dd><p>Argument for the function</p></dd> <dt>float <i class="arg">k</i></dt> <dd><p>Parameter</p></dd> </dl></dd> <dt><a name="16"><b class="cmd">::math::special::dn</b> <i class="arg">u</i> <i class="arg">k</i></a></dt> <dd><p>Compute the elliptic function <em>dn</em> for the argument "u" and parameter "k".</p> <dl class="doctools_arguments"> <dt>float <i class="arg">u</i></dt> <dd><p>Argument for the function</p></dd> <dt>float <i class="arg">k</i></dt> <dd><p>Parameter</p></dd> </dl></dd> <dt><a name="17"><b class="cmd">::math::special::sn</b> <i class="arg">u</i> <i class="arg">k</i></a></dt> <dd><p>Compute the elliptic function <em>sn</em> for the argument "u" and parameter "k".</p> <dl class="doctools_arguments"> <dt>float <i class="arg">u</i></dt> <dd><p>Argument for the function</p></dd> <dt>float <i class="arg">k</i></dt> <dd><p>Parameter</p></dd> </dl></dd> <dt><a name="18"><b class="cmd">::math::special::elliptic_K</b> <i class="arg">k</i></a></dt> <dd><p>Compute the complete elliptic integral of the first kind for the argument "k"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">k</i></dt> <dd><p>Argument for the function</p></dd> </dl></dd> <dt><a name="19"><b class="cmd">::math::special::elliptic_E</b> <i class="arg">k</i></a></dt> <dd><p>Compute the complete elliptic integral of the second kind for the argument "k"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">k</i></dt> <dd><p>Argument for the function</p></dd> </dl></dd> <dt><a name="20"><b class="cmd">::math::special::exponential_Ei</b> <i class="arg">x</i></a></dt> <dd><p>Compute the exponential integral of the second kind for the argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the function (x != 0)</p></dd> </dl></dd> <dt><a name="21"><b class="cmd">::math::special::exponential_En</b> <i class="arg">n</i> <i class="arg">x</i></a></dt> <dd><p>Compute the exponential integral of the first kind for the argument "x" and order n</p> <dl class="doctools_arguments"> <dt>int <i class="arg">n</i></dt> <dd><p>Order of the integral (n >= 0)</p></dd> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the function (x >= 0)</p></dd> </dl></dd> <dt><a name="22"><b class="cmd">::math::special::exponential_li</b> <i class="arg">x</i></a></dt> <dd><p>Compute the logarithmic integral for the argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the function (x > 0)</p></dd> </dl></dd> <dt><a name="23"><b class="cmd">::math::special::exponential_Ci</b> <i class="arg">x</i></a></dt> <dd><p>Compute the cosine integral for the argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the function (x > 0)</p></dd> </dl></dd> <dt><a name="24"><b class="cmd">::math::special::exponential_Si</b> <i class="arg">x</i></a></dt> <dd><p>Compute the sine integral for the argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the function (x > 0)</p></dd> </dl></dd> <dt><a name="25"><b class="cmd">::math::special::exponential_Chi</b> <i class="arg">x</i></a></dt> <dd><p>Compute the hyperbolic cosine integral for the argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the function (x > 0)</p></dd> </dl></dd> <dt><a name="26"><b class="cmd">::math::special::exponential_Shi</b> <i class="arg">x</i></a></dt> <dd><p>Compute the hyperbolic sine integral for the argument "x"</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the function (x > 0)</p></dd> </dl></dd> <dt><a name="27"><b class="cmd">::math::special::fresnel_C</b> <i class="arg">x</i></a></dt> <dd><p>Compute the Fresnel cosine integral for real argument x</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the function</p></dd> </dl></dd> <dt><a name="28"><b class="cmd">::math::special::fresnel_S</b> <i class="arg">x</i></a></dt> <dd><p>Compute the Fresnel sine integral for real argument x</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the function</p></dd> </dl></dd> <dt><a name="29"><b class="cmd">::math::special::sinc</b> <i class="arg">x</i></a></dt> <dd><p>Compute the sinc function for real argument x</p> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>Argument for the function</p></dd> </dl></dd> <dt><a name="30"><b class="cmd">::math::special::legendre</b> <i class="arg">n</i></a></dt> <dd><p>Return the Legendre polynomial of degree n (see <span class="sectref"><a href="#section4">THE ORTHOGONAL POLYNOMIALS</a></span>)</p> <dl class="doctools_arguments"> <dt>int <i class="arg">n</i></dt> <dd><p>Degree of the polynomial</p></dd> </dl></dd> <dt><a name="31"><b class="cmd">::math::special::chebyshev</b> <i class="arg">n</i></a></dt> <dd><p>Return the Chebyshev polynomial of degree n (of the first kind)</p> <dl class="doctools_arguments"> <dt>int <i class="arg">n</i></dt> <dd><p>Degree of the polynomial</p></dd> </dl></dd> <dt><a name="32"><b class="cmd">::math::special::laguerre</b> <i class="arg">alpha</i> <i class="arg">n</i></a></dt> <dd><p>Return the Laguerre polynomial of degree n with parameter alpha</p> <dl class="doctools_arguments"> <dt>float <i class="arg">alpha</i></dt> <dd><p>Parameter of the Laguerre polynomial</p></dd> <dt>int <i class="arg">n</i></dt> <dd><p>Degree of the polynomial</p></dd> </dl></dd> <dt><a name="33"><b class="cmd">::math::special::hermite</b> <i class="arg">n</i></a></dt> <dd><p>Return the Hermite polynomial of degree n</p> <dl class="doctools_arguments"> <dt>int <i class="arg">n</i></dt> <dd><p>Degree of the polynomial</p></dd> </dl></dd> </dl> </div> |
︙ | ︙ |
Changes to idoc/www/tcllib/files/modules/math/statistics.html.
︙ | ︙ | |||
166 167 168 169 170 171 172 | <li><a href="#31"><b class="cmd">::math::statistics::print-2x2</b> <i class="arg">n11</i> <i class="arg">n21</i> <i class="arg">n12</i> <i class="arg">n22</i></a></li> <li><a href="#32"><b class="cmd">::math::statistics::control-xbar</b> <i class="arg">data</i> <span class="opt">?nsamples?</span></a></li> <li><a href="#33"><b class="cmd">::math::statistics::control-Rchart</b> <i class="arg">data</i> <span class="opt">?nsamples?</span></a></li> <li><a href="#34"><b class="cmd">::math::statistics::test-xbar</b> <i class="arg">control</i> <i class="arg">data</i></a></li> <li><a href="#35"><b class="cmd">::math::statistics::test-Rchart</b> <i class="arg">control</i> <i class="arg">data</i></a></li> <li><a href="#36"><b class="cmd">::math::statistics::test-Kruskal-Wallis</b> <i class="arg">confidence</i> <i class="arg">args</i></a></li> <li><a href="#37"><b class="cmd">::math::statistics::analyse-Kruskal-Wallis</b> <i class="arg">args</i></a></li> | > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > | | | | | | | | | | | | | | | > > > | | | | | | | | | | | | | | | | > > > | | | | | > > | | | | | | | | | | | 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | <li><a href="#31"><b class="cmd">::math::statistics::print-2x2</b> <i class="arg">n11</i> <i class="arg">n21</i> <i class="arg">n12</i> <i class="arg">n22</i></a></li> <li><a href="#32"><b class="cmd">::math::statistics::control-xbar</b> <i class="arg">data</i> <span class="opt">?nsamples?</span></a></li> <li><a href="#33"><b class="cmd">::math::statistics::control-Rchart</b> <i class="arg">data</i> <span class="opt">?nsamples?</span></a></li> <li><a href="#34"><b class="cmd">::math::statistics::test-xbar</b> <i class="arg">control</i> <i class="arg">data</i></a></li> <li><a href="#35"><b class="cmd">::math::statistics::test-Rchart</b> <i class="arg">control</i> <i class="arg">data</i></a></li> <li><a href="#36"><b class="cmd">::math::statistics::test-Kruskal-Wallis</b> <i class="arg">confidence</i> <i class="arg">args</i></a></li> <li><a href="#37"><b class="cmd">::math::statistics::analyse-Kruskal-Wallis</b> <i class="arg">args</i></a></li> <li><a href="#38"><b class="cmd">::math::statistics::test-Levene</b> <i class="arg">groups</i></a></li> <li><a href="#39"><b class="cmd">::math::statistics::test-Brown-Forsythe</b> <i class="arg">groups</i></a></li> <li><a href="#40"><b class="cmd">::math::statistics::group-rank</b> <i class="arg">args</i></a></li> <li><a href="#41"><b class="cmd">::math::statistics::test-Wilcoxon</b> <i class="arg">sample_a</i> <i class="arg">sample_b</i></a></li> <li><a href="#42"><b class="cmd">::math::statistics::spearman-rank</b> <i class="arg">sample_a</i> <i class="arg">sample_b</i></a></li> <li><a href="#43"><b class="cmd">::math::statistics::spearman-rank-extended</b> <i class="arg">sample_a</i> <i class="arg">sample_b</i></a></li> <li><a href="#44"><b class="cmd">::math::statistics::kernel-density</b> <i class="arg">data</i> opt <i class="arg">-option value</i> ...</a></li> <li><a href="#45"><b class="cmd">::math::statistics::bootstrap</b> <i class="arg">data</i> <i class="arg">sampleSize</i> <span class="opt">?numberSamples?</span></a></li> <li><a href="#46"><b class="cmd">::math::statistics::wasserstein-distance</b> <i class="arg">prob1</i> <i class="arg">prob2</i></a></li> <li><a href="#47"><b class="cmd">::math::statistics::kl-divergence</b> <i class="arg">prob1</i> <i class="arg">prob2</i></a></li> <li><a href="#48"><b class="cmd">::math::statistics::logistic-model</b> <i class="arg">xdata</i> <i class="arg">ydata</i></a></li> <li><a href="#49"><b class="cmd">::math::statistics::logistic-probability</b> <i class="arg">coeffs</i> <i class="arg">x</i></a></li> <li><a href="#50"><b class="cmd">::math::statistics::tstat</b> <i class="arg">dof</i> <span class="opt">?alpha?</span></a></li> <li><a href="#51"><b class="cmd">::math::statistics::mv-wls</b> <i class="arg">wt1</i> <i class="arg">weights_and_values</i></a></li> <li><a href="#52"><b class="cmd">::math::statistics::mv-ols</b> <i class="arg">values</i></a></li> <li><a href="#53"><b class="cmd">::math::statistics::pdf-normal</b> <i class="arg">mean</i> <i class="arg">stdev</i> <i class="arg">value</i></a></li> <li><a href="#54"><b class="cmd">::math::statistics::pdf-lognormal</b> <i class="arg">mean</i> <i class="arg">stdev</i> <i class="arg">value</i></a></li> <li><a href="#55"><b class="cmd">::math::statistics::pdf-exponential</b> <i class="arg">mean</i> <i class="arg">value</i></a></li> <li><a href="#56"><b class="cmd">::math::statistics::pdf-uniform</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">value</i></a></li> <li><a href="#57"><b class="cmd">::math::statistics::pdf-triangular</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">value</i></a></li> <li><a href="#58"><b class="cmd">::math::statistics::pdf-symmetric-triangular</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">value</i></a></li> <li><a href="#59"><b class="cmd">::math::statistics::pdf-gamma</b> <i class="arg">alpha</i> <i class="arg">beta</i> <i class="arg">value</i></a></li> <li><a href="#60"><b class="cmd">::math::statistics::pdf-poisson</b> <i class="arg">mu</i> <i class="arg">k</i></a></li> <li><a href="#61"><b class="cmd">::math::statistics::pdf-chisquare</b> <i class="arg">df</i> <i class="arg">value</i></a></li> <li><a href="#62"><b class="cmd">::math::statistics::pdf-student-t</b> <i class="arg">df</i> <i class="arg">value</i></a></li> <li><a href="#63"><b class="cmd">::math::statistics::pdf-gamma</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">value</i></a></li> <li><a href="#64"><b class="cmd">::math::statistics::pdf-beta</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">value</i></a></li> <li><a href="#65"><b class="cmd">::math::statistics::pdf-weibull</b> <i class="arg">scale</i> <i class="arg">shape</i> <i class="arg">value</i></a></li> <li><a href="#66"><b class="cmd">::math::statistics::pdf-gumbel</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">value</i></a></li> <li><a href="#67"><b class="cmd">::math::statistics::pdf-pareto</b> <i class="arg">scale</i> <i class="arg">shape</i> <i class="arg">value</i></a></li> <li><a href="#68"><b class="cmd">::math::statistics::pdf-cauchy</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">value</i></a></li> <li><a href="#69"><b class="cmd">::math::statistics::pdf-laplace</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">value</i></a></li> <li><a href="#70"><b class="cmd">::math::statistics::pdf-kumaraswamy</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">value</i></a></li> <li><a href="#71"><b class="cmd">::math::statistics::pdf-negative-binomial</b> <i class="arg">r</i> <i class="arg">p</i> <i class="arg">value</i></a></li> <li><a href="#72"><b class="cmd">::math::statistics::cdf-normal</b> <i class="arg">mean</i> <i class="arg">stdev</i> <i class="arg">value</i></a></li> <li><a href="#73"><b class="cmd">::math::statistics::cdf-lognormal</b> <i class="arg">mean</i> <i class="arg">stdev</i> <i class="arg">value</i></a></li> <li><a href="#74"><b class="cmd">::math::statistics::cdf-exponential</b> <i class="arg">mean</i> <i class="arg">value</i></a></li> <li><a href="#75"><b class="cmd">::math::statistics::cdf-uniform</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">value</i></a></li> <li><a href="#76"><b class="cmd">::math::statistics::cdf-triangular</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">value</i></a></li> <li><a href="#77"><b class="cmd">::math::statistics::cdf-symmetric-triangular</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">value</i></a></li> <li><a href="#78"><b class="cmd">::math::statistics::cdf-students-t</b> <i class="arg">degrees</i> <i class="arg">value</i></a></li> <li><a href="#79"><b class="cmd">::math::statistics::cdf-gamma</b> <i class="arg">alpha</i> <i class="arg">beta</i> <i class="arg">value</i></a></li> <li><a href="#80"><b class="cmd">::math::statistics::cdf-poisson</b> <i class="arg">mu</i> <i class="arg">k</i></a></li> <li><a href="#81"><b class="cmd">::math::statistics::cdf-beta</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">value</i></a></li> <li><a href="#82"><b class="cmd">::math::statistics::cdf-weibull</b> <i class="arg">scale</i> <i class="arg">shape</i> <i class="arg">value</i></a></li> <li><a href="#83"><b class="cmd">::math::statistics::cdf-gumbel</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">value</i></a></li> <li><a href="#84"><b class="cmd">::math::statistics::cdf-pareto</b> <i class="arg">scale</i> <i class="arg">shape</i> <i class="arg">value</i></a></li> <li><a href="#85"><b class="cmd">::math::statistics::cdf-cauchy</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">value</i></a></li> <li><a href="#86"><b class="cmd">::math::statistics::cdf-F</b> <i class="arg">nf1</i> <i class="arg">nf2</i> <i class="arg">value</i></a></li> <li><a href="#87"><b class="cmd">::math::statistics::cdf-laplace</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">value</i></a></li> <li><a href="#88"><b class="cmd">::math::statistics::cdf-kumaraswamy</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">value</i></a></li> <li><a href="#89"><b class="cmd">::math::statistics::cdf-negative-binomial</b> <i class="arg">r</i> <i class="arg">p</i> <i class="arg">value</i></a></li> <li><a href="#90"><b class="cmd">::math::statistics::empirical-distribution</b> <i class="arg">values</i></a></li> <li><a href="#91"><b class="cmd">::math::statistics::random-normal</b> <i class="arg">mean</i> <i class="arg">stdev</i> <i class="arg">number</i></a></li> <li><a href="#92"><b class="cmd">::math::statistics::random-lognormal</b> <i class="arg">mean</i> <i class="arg">stdev</i> <i class="arg">number</i></a></li> <li><a href="#93"><b class="cmd">::math::statistics::random-exponential</b> <i class="arg">mean</i> <i class="arg">number</i></a></li> <li><a href="#94"><b class="cmd">::math::statistics::random-uniform</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">number</i></a></li> <li><a href="#95"><b class="cmd">::math::statistics::random-triangular</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">number</i></a></li> <li><a href="#96"><b class="cmd">::math::statistics::random-symmetric-triangular</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">number</i></a></li> <li><a href="#97"><b class="cmd">::math::statistics::random-gamma</b> <i class="arg">alpha</i> <i class="arg">beta</i> <i class="arg">number</i></a></li> <li><a href="#98"><b class="cmd">::math::statistics::random-poisson</b> <i class="arg">mu</i> <i class="arg">number</i></a></li> <li><a href="#99"><b class="cmd">::math::statistics::random-chisquare</b> <i class="arg">df</i> <i class="arg">number</i></a></li> <li><a href="#100"><b class="cmd">::math::statistics::random-student-t</b> <i class="arg">df</i> <i class="arg">number</i></a></li> <li><a href="#101"><b class="cmd">::math::statistics::random-beta</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">number</i></a></li> <li><a href="#102"><b class="cmd">::math::statistics::random-weibull</b> <i class="arg">scale</i> <i class="arg">shape</i> <i class="arg">number</i></a></li> <li><a href="#103"><b class="cmd">::math::statistics::random-gumbel</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">number</i></a></li> <li><a href="#104"><b class="cmd">::math::statistics::random-pareto</b> <i class="arg">scale</i> <i class="arg">shape</i> <i class="arg">number</i></a></li> <li><a href="#105"><b class="cmd">::math::statistics::random-cauchy</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">number</i></a></li> <li><a href="#106"><b class="cmd">::math::statistics::random-laplace</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">number</i></a></li> <li><a href="#107"><b class="cmd">::math::statistics::random-kumaraswamy</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">number</i></a></li> <li><a href="#108"><b class="cmd">::math::statistics::random-negative-binomial</b> <i class="arg">r</i> <i class="arg">p</i> <i class="arg">number</i></a></li> <li><a href="#109"><b class="cmd">::math::statistics::histogram-uniform</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">limits</i> <i class="arg">number</i></a></li> <li><a href="#110"><b class="cmd">::math::statistics::incompleteGamma</b> <i class="arg">x</i> <i class="arg">p</i> <span class="opt">?tol?</span></a></li> <li><a href="#111"><b class="cmd">::math::statistics::incompleteBeta</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">x</i> <span class="opt">?tol?</span></a></li> <li><a href="#112"><b class="cmd">::math::statistics::estimate-pareto</b> <i class="arg">values</i></a></li> <li><a href="#113"><b class="cmd">::math::statistics::estimate-exponential</b> <i class="arg">values</i></a></li> <li><a href="#114"><b class="cmd">::math::statistics::estimate-laplace</b> <i class="arg">values</i></a></li> <li><a href="#115"><b class="cmd">::math::statistics::estimante-negative-binomial</b> <i class="arg">r</i> <i class="arg">values</i></a></li> <li><a href="#116"><b class="cmd">::math::statistics::filter</b> <i class="arg">varname</i> <i class="arg">data</i> <i class="arg">expression</i></a></li> <li><a href="#117"><b class="cmd">::math::statistics::map</b> <i class="arg">varname</i> <i class="arg">data</i> <i class="arg">expression</i></a></li> <li><a href="#118"><b class="cmd">::math::statistics::samplescount</b> <i class="arg">varname</i> <i class="arg">list</i> <i class="arg">expression</i></a></li> <li><a href="#119"><b class="cmd">::math::statistics::subdivide</b></a></li> <li><a href="#120"><b class="cmd">::math::statistics::plot-scale</b> <i class="arg">canvas</i> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">ymin</i> <i class="arg">ymax</i></a></li> <li><a href="#121"><b class="cmd">::math::statistics::plot-xydata</b> <i class="arg">canvas</i> <i class="arg">xdata</i> <i class="arg">ydata</i> <i class="arg">tag</i></a></li> <li><a href="#122"><b class="cmd">::math::statistics::plot-xyline</b> <i class="arg">canvas</i> <i class="arg">xdata</i> <i class="arg">ydata</i> <i class="arg">tag</i></a></li> <li><a href="#123"><b class="cmd">::math::statistics::plot-tdata</b> <i class="arg">canvas</i> <i class="arg">tdata</i> <i class="arg">tag</i></a></li> <li><a href="#124"><b class="cmd">::math::statistics::plot-tline</b> <i class="arg">canvas</i> <i class="arg">tdata</i> <i class="arg">tag</i></a></li> <li><a href="#125"><b class="cmd">::math::statistics::plot-histogram</b> <i class="arg">canvas</i> <i class="arg">counts</i> <i class="arg">limits</i> <i class="arg">tag</i></a></li> </ul> </div> </div> <div id="section1" class="doctools_section"><h2><a name="section1">Description</a></h2> <p>The <b class="package">math::statistics</b> package contains functions and procedures for basic statistical data analysis, such as:</p> <ul class="doctools_itemized"> |
︙ | ︙ | |||
701 702 703 704 705 706 707 | Returns the Kruskal-Wallis statistic and the probability that that value would occur assuming the medians of the populations are equal.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">args</i></dt> <dd><p>- Two or more lists of data</p></dd> </dl></dd> | > > > > > > > > > > > > > > > > > > > | | | | | | | 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 | Returns the Kruskal-Wallis statistic and the probability that that value would occur assuming the medians of the populations are equal.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">args</i></dt> <dd><p>- Two or more lists of data</p></dd> </dl></dd> <dt><a name="38"><b class="cmd">::math::statistics::test-Levene</b> <i class="arg">groups</i></a></dt> <dd><p>Compute the Levene statistic to determine if groups of data have the same variance (are homoscadastic) or not. The data are organised in groups. This version uses the mean of the data as the measure to determine the deviations. The statistic is equivalent to an F statistic with degrees of freedom k-1 and N-k, k being the number of groups and N the total number of data.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">groups</i></dt> <dd><p>- List of groups of data</p></dd> </dl></dd> <dt><a name="39"><b class="cmd">::math::statistics::test-Brown-Forsythe</b> <i class="arg">groups</i></a></dt> <dd><p>Compute the Brown-Forsythe statistic to determine if groups of data have the same variance (are homoscadastic) or not. Like the Levene test, but this version uses the median of the data.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">groups</i></dt> <dd><p>- List of groups of data</p></dd> </dl></dd> <dt><a name="40"><b class="cmd">::math::statistics::group-rank</b> <i class="arg">args</i></a></dt> <dd><p>Rank the groups of data with respect to the complete set. Returns a list consisting of the group ID, the value and the rank (possibly a rational number, in case of ties) for each data item.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">args</i></dt> <dd><p>- Two or more lists of data</p></dd> </dl></dd> <dt><a name="41"><b class="cmd">::math::statistics::test-Wilcoxon</b> <i class="arg">sample_a</i> <i class="arg">sample_b</i></a></dt> <dd><p>Compute the Wilcoxon test statistic to determine if two samples have the same median or not. (The statistic can be regarded as standard normal, if the sample sizes are both larger than 10.) Returns the value of this statistic.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">sample_a</i></dt> <dd><p>- List of data comprising the first sample</p></dd> <dt>list <i class="arg">sample_b</i></dt> <dd><p>- List of data comprising the second sample</p></dd> </dl></dd> <dt><a name="42"><b class="cmd">::math::statistics::spearman-rank</b> <i class="arg">sample_a</i> <i class="arg">sample_b</i></a></dt> <dd><p>Return the Spearman rank correlation as an alternative to the ordinary (Pearson's) correlation coefficient. The two samples should have the same number of data.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">sample_a</i></dt> <dd><p>- First list of data</p></dd> <dt>list <i class="arg">sample_b</i></dt> <dd><p>- Second list of data</p></dd> </dl></dd> <dt><a name="43"><b class="cmd">::math::statistics::spearman-rank-extended</b> <i class="arg">sample_a</i> <i class="arg">sample_b</i></a></dt> <dd><p>Return the Spearman rank correlation as an alternative to the ordinary (Pearson's) correlation coefficient as well as additional data. The two samples should have the same number of data. The procedure returns the correlation coefficient, the number of data pairs used and the z-score, an approximately standard normal statistic, indicating the significance of the correlation.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">sample_a</i></dt> <dd><p>- First list of data</p></dd> <dt>list <i class="arg">sample_b</i></dt> <dd><p>- Second list of data</p></dd> </dl></dd> <dt><a name="44"><b class="cmd">::math::statistics::kernel-density</b> <i class="arg">data</i> opt <i class="arg">-option value</i> ...</a></dt> <dd><p>Return the density function based on kernel density estimation. The procedure is controlled by a small set of options, each of which is given a reasonable default.</p> <p>The return value consists of three lists: the centres of the bins, the associated probability density and a list of computational parameters (begin and end of the interval, mean and standard deviation and the used bandwidth). The computational parameters can be used for further analysis.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">data</i></dt> |
︙ | ︙ | |||
765 766 767 768 769 770 771 | <dd><p>Begin and end of the interval for which the density is returned (default: mean +/- 3*standard deviation)</p></dd> <dt><b class="option">-kernel</b> <i class="arg">function</i></dt> <dd><p>Kernel to be used (One of: gaussian, cosine, epanechnikov, uniform, triangular, biweight, logistic; default: gaussian)</p></dd> </dl></dd> </dl></dd> | | | | | | | 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 | <dd><p>Begin and end of the interval for which the density is returned (default: mean +/- 3*standard deviation)</p></dd> <dt><b class="option">-kernel</b> <i class="arg">function</i></dt> <dd><p>Kernel to be used (One of: gaussian, cosine, epanechnikov, uniform, triangular, biweight, logistic; default: gaussian)</p></dd> </dl></dd> </dl></dd> <dt><a name="45"><b class="cmd">::math::statistics::bootstrap</b> <i class="arg">data</i> <i class="arg">sampleSize</i> <span class="opt">?numberSamples?</span></a></dt> <dd><p>Create a subsample or subsamples from a given list of data. The data in the samples are chosen from this list - multiples may occur. If there is only one subsample, the sample itself is returned (as a list of "sampleSize" values), otherwise a list of samples is returned.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">data</i></dt> <dd><p>List of values to chose from</p></dd> <dt>int <i class="arg">sampleSize</i></dt> <dd><p>Number of values per sample</p></dd> <dt>int <i class="arg">numberSamples</i></dt> <dd><p>Number of samples (default: 1)</p></dd> </dl></dd> <dt><a name="46"><b class="cmd">::math::statistics::wasserstein-distance</b> <i class="arg">prob1</i> <i class="arg">prob2</i></a></dt> <dd><p>Compute the Wasserstein distance or earth mover's distance for two equidstantly spaced histograms or probability densities. The histograms need not to be normalised to sum to one, but they must have the same number of entries.</p> <p>Note: the histograms are assumed to be based on the same equidistant intervals. As the bounds are not passed, the value is expressed in the length of the intervals.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">prob1</i></dt> <dd><p>List of values for the first histogram/probability density</p></dd> <dt>list <i class="arg">prob2</i></dt> <dd><p>List of values for the second histogram/probability density</p></dd> </dl></dd> <dt><a name="47"><b class="cmd">::math::statistics::kl-divergence</b> <i class="arg">prob1</i> <i class="arg">prob2</i></a></dt> <dd><p>Compute the Kullback-Leibler (KL) divergence for two equidstantly spaced histograms or probability densities. The histograms need not to be normalised to sum to one, but they must have the same number of entries.</p> <p>Note: the histograms are assumed to be based on the same equidistant intervals. As the bounds are not passed, the value is expressed in the length of the intervals.</p> <p>Note also that the KL divergence is not symmetric and that the second histogram should not contain zeroes in places where the first histogram has non-zero values.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">prob1</i></dt> <dd><p>List of values for the first histogram/probability density</p></dd> <dt>list <i class="arg">prob2</i></dt> <dd><p>List of values for the second histogram/probability density</p></dd> </dl></dd> <dt><a name="48"><b class="cmd">::math::statistics::logistic-model</b> <i class="arg">xdata</i> <i class="arg">ydata</i></a></dt> <dd><p>Estimate the coefficients of the logistic model that fits the data best. The data consist of independent x-values and the outcome 0 or 1 for each of the x-values. The result can be used to estimate the probability that a certain x-value gives 1.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">xdata</i></dt> <dd><p>List of values for which the success (1) or failure (0) is known</p></dd> <dt>list <i class="arg">ydata</i></dt> <dd><p>List of successes or failures corresponding to each value in <i class="term">xdata</i>.</p></dd> </dl></dd> <dt><a name="49"><b class="cmd">::math::statistics::logistic-probability</b> <i class="arg">coeffs</i> <i class="arg">x</i></a></dt> <dd><p>Calculate the probability of success for the value <i class="term">x</i> given the coefficients of the logistic model.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">coeffs</i></dt> <dd><p>List of coefficients as determine by the <b class="cmd">logistic-model</b> command</p></dd> <dt>float <i class="arg">x</i></dt> <dd><p>X-value for which the probability needs to be determined</p></dd> |
︙ | ︙ | |||
836 837 838 839 840 841 842 | <p>In addition to these two, it provides a procedure (tstat) for calculating the value of the t-statistic for the specified number of degrees of freedom that is required to demonstrate a given level of significance.</p> <p>Note: These procedures depend on the math::linearalgebra package.</p> <p><em>Description of the procedures</em></p> <dl class="doctools_definitions"> | | | 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 | <p>In addition to these two, it provides a procedure (tstat) for calculating the value of the t-statistic for the specified number of degrees of freedom that is required to demonstrate a given level of significance.</p> <p>Note: These procedures depend on the math::linearalgebra package.</p> <p><em>Description of the procedures</em></p> <dl class="doctools_definitions"> <dt><a name="50"><b class="cmd">::math::statistics::tstat</b> <i class="arg">dof</i> <span class="opt">?alpha?</span></a></dt> <dd><p>Returns the value of the t-distribution t* satisfying</p> <pre class="doctools_example"> P(t*) = 1 - alpha/2 P(-t*) = alpha/2 </pre> <p>for the number of degrees of freedom dof.</p> <p>Given a sample of normally-distributed data x, with an |
︙ | ︙ | |||
860 861 862 863 864 865 866 | the given confidence level.</p> <dl class="doctools_arguments"> <dt>int <i class="arg">dof</i></dt> <dd><p>Number of degrees of freedom</p></dd> <dt>float <i class="arg">alpha</i></dt> <dd><p>Confidence level of the t-distribution. Defaults to 0.05.</p></dd> </dl></dd> | | | 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 | the given confidence level.</p> <dl class="doctools_arguments"> <dt>int <i class="arg">dof</i></dt> <dd><p>Number of degrees of freedom</p></dd> <dt>float <i class="arg">alpha</i></dt> <dd><p>Confidence level of the t-distribution. Defaults to 0.05.</p></dd> </dl></dd> <dt><a name="51"><b class="cmd">::math::statistics::mv-wls</b> <i class="arg">wt1</i> <i class="arg">weights_and_values</i></a></dt> <dd><p>Carries out a weighted least squares linear regression for the data points provided, with weights assigned to each point.</p> <p>The linear model is of the form</p> <pre class="doctools_example"> y = b0 + b1 * x1 + b2 * x2 ... + bN * xN + error </pre> <p>and each point satisfies</p> |
︙ | ︙ | |||
890 891 892 893 894 895 896 | <dt>list <i class="arg">weights_and_values</i></dt> <dd><p>A list consisting of: the weight for the first observation, the data for the first observation (as a sublist), the weight for the second observation (as a sublist) and so on. The sublists of data are organised as lists of the value of the dependent variable y and the independent variables x1, x2 to xN.</p></dd> </dl></dd> | | | 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 | <dt>list <i class="arg">weights_and_values</i></dt> <dd><p>A list consisting of: the weight for the first observation, the data for the first observation (as a sublist), the weight for the second observation (as a sublist) and so on. The sublists of data are organised as lists of the value of the dependent variable y and the independent variables x1, x2 to xN.</p></dd> </dl></dd> <dt><a name="52"><b class="cmd">::math::statistics::mv-ols</b> <i class="arg">values</i></a></dt> <dd><p>Carries out an ordinary least squares linear regression for the data points provided.</p> <p>This procedure simply calls ::mvlinreg::wls with the weights set to 1.0, and returns the same information.</p></dd> </dl> <p><em>Example of the use:</em></p> <pre class="doctools_example"> |
︙ | ︙ | |||
955 956 957 958 959 960 961 | <li><p>The cumulative density (cdf-*)</p></li> <li><p>Quantiles for the given distribution (quantiles-*)</p></li> <li><p>Histograms for the given distribution (histogram-*)</p></li> <li><p>List of random values with the given distribution (random-*)</p></li> </ul> <p>The following procedures have been implemented:</p> <dl class="doctools_definitions"> | | | | | | | | | | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | > > > > > > > > > > > > > > > > | | | | | | | | | | | 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 | <li><p>The cumulative density (cdf-*)</p></li> <li><p>Quantiles for the given distribution (quantiles-*)</p></li> <li><p>Histograms for the given distribution (histogram-*)</p></li> <li><p>List of random values with the given distribution (random-*)</p></li> </ul> <p>The following procedures have been implemented:</p> <dl class="doctools_definitions"> <dt><a name="53"><b class="cmd">::math::statistics::pdf-normal</b> <i class="arg">mean</i> <i class="arg">stdev</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a normal distribution with given mean and standard deviation.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">mean</i></dt> <dd><p>- Mean value of the distribution</p></dd> <dt>float <i class="arg">stdev</i></dt> <dd><p>- Standard deviation of the distribution</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="54"><b class="cmd">::math::statistics::pdf-lognormal</b> <i class="arg">mean</i> <i class="arg">stdev</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a log-normal distribution with given mean and standard deviation.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">mean</i></dt> <dd><p>- Mean value of the distribution</p></dd> <dt>float <i class="arg">stdev</i></dt> <dd><p>- Standard deviation of the distribution</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="55"><b class="cmd">::math::statistics::pdf-exponential</b> <i class="arg">mean</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for an exponential distribution with given mean.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">mean</i></dt> <dd><p>- Mean value of the distribution</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="56"><b class="cmd">::math::statistics::pdf-uniform</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a uniform distribution with given extremes.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Minimum value of the distribution</p></dd> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Maximum value of the distribution</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="57"><b class="cmd">::math::statistics::pdf-triangular</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a triangular distribution with given extremes. If the argument min is lower than the argument max, then smaller values have higher probability and vice versa. In the first case the probability density function is of the form <em>f(x) = 2(1-x)</em> and the other case it is of the form <em>f(x) = 2x</em>.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Minimum value of the distribution</p></dd> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Maximum value of the distribution</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="58"><b class="cmd">::math::statistics::pdf-symmetric-triangular</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a symmetric triangular distribution with given extremes.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Minimum value of the distribution</p></dd> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Maximum value of the distribution</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="59"><b class="cmd">::math::statistics::pdf-gamma</b> <i class="arg">alpha</i> <i class="arg">beta</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a Gamma distribution with given shape and rate parameters</p> <dl class="doctools_arguments"> <dt>float <i class="arg">alpha</i></dt> <dd><p>- Shape parameter</p></dd> <dt>float <i class="arg">beta</i></dt> <dd><p>- Rate parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="60"><b class="cmd">::math::statistics::pdf-poisson</b> <i class="arg">mu</i> <i class="arg">k</i></a></dt> <dd><p>Return the probability of a given number of occurrences in the same interval (k) for a Poisson distribution with given mean (mu)</p> <dl class="doctools_arguments"> <dt>float <i class="arg">mu</i></dt> <dd><p>- Mean number of occurrences</p></dd> <dt>int <i class="arg">k</i></dt> <dd><p>- Number of occurences</p></dd> </dl></dd> <dt><a name="61"><b class="cmd">::math::statistics::pdf-chisquare</b> <i class="arg">df</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a chi square distribution with given degrees of freedom</p> <dl class="doctools_arguments"> <dt>float <i class="arg">df</i></dt> <dd><p>- Degrees of freedom</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="62"><b class="cmd">::math::statistics::pdf-student-t</b> <i class="arg">df</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a Student's t distribution with given degrees of freedom</p> <dl class="doctools_arguments"> <dt>float <i class="arg">df</i></dt> <dd><p>- Degrees of freedom</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="63"><b class="cmd">::math::statistics::pdf-gamma</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a Gamma distribution with given shape and rate parameters</p> <dl class="doctools_arguments"> <dt>float <i class="arg">a</i></dt> <dd><p>- Shape parameter</p></dd> <dt>float <i class="arg">b</i></dt> <dd><p>- Rate parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="64"><b class="cmd">::math::statistics::pdf-beta</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a Beta distribution with given shape parameters</p> <dl class="doctools_arguments"> <dt>float <i class="arg">a</i></dt> <dd><p>- First shape parameter</p></dd> <dt>float <i class="arg">b</i></dt> <dd><p>- Second shape parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="65"><b class="cmd">::math::statistics::pdf-weibull</b> <i class="arg">scale</i> <i class="arg">shape</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a Weibull distribution with given scale and shape parameters</p> <dl class="doctools_arguments"> <dt>float <i class="arg">location</i></dt> <dd><p>- Scale parameter</p></dd> <dt>float <i class="arg">scale</i></dt> <dd><p>- Shape parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="66"><b class="cmd">::math::statistics::pdf-gumbel</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a Gumbel distribution with given location and shape parameters</p> <dl class="doctools_arguments"> <dt>float <i class="arg">location</i></dt> <dd><p>- Location parameter</p></dd> <dt>float <i class="arg">scale</i></dt> <dd><p>- Shape parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="67"><b class="cmd">::math::statistics::pdf-pareto</b> <i class="arg">scale</i> <i class="arg">shape</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a Pareto distribution with given scale and shape parameters</p> <dl class="doctools_arguments"> <dt>float <i class="arg">scale</i></dt> <dd><p>- Scale parameter</p></dd> <dt>float <i class="arg">shape</i></dt> <dd><p>- Shape parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="68"><b class="cmd">::math::statistics::pdf-cauchy</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a Cauchy distribution with given location and shape parameters. Note that the Cauchy distribution has no finite higher-order moments.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">location</i></dt> <dd><p>- Location parameter</p></dd> <dt>float <i class="arg">scale</i></dt> <dd><p>- Shape parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="69"><b class="cmd">::math::statistics::pdf-laplace</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a Laplace distribution with given location and shape parameters. The Laplace distribution consists of two exponential functions, is peaked and has heavier tails than the normal distribution.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">location</i></dt> <dd><p>- Location parameter (mean)</p></dd> <dt>float <i class="arg">scale</i></dt> <dd><p>- Shape parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="70"><b class="cmd">::math::statistics::pdf-kumaraswamy</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a Kumaraswamy distribution with given parameters a and b. The Kumaraswamy distribution is related to the Beta distribution, but has a tractable cumulative distribution function.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">a</i></dt> <dd><p>- Parameter a</p></dd> <dt>float <i class="arg">b</i></dt> <dd><p>- Parameter b</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="71"><b class="cmd">::math::statistics::pdf-negative-binomial</b> <i class="arg">r</i> <i class="arg">p</i> <i class="arg">value</i></a></dt> <dd><p>Return the probability of a given value for a negative binomial distribution with an allowed number of failures and the probability of success.</p> <dl class="doctools_arguments"> <dt>int <i class="arg">r</i></dt> <dd><p>- Allowed number of failures (at least 1)</p></dd> <dt>float <i class="arg">p</i></dt> <dd><p>- Probability of success</p></dd> <dt>int <i class="arg">value</i></dt> <dd><p>- Number of successes for which the probability is to be returned</p></dd> </dl></dd> <dt><a name="72"><b class="cmd">::math::statistics::cdf-normal</b> <i class="arg">mean</i> <i class="arg">stdev</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a normal distribution with given mean and standard deviation, that is the probability for values up to the given one.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">mean</i></dt> <dd><p>- Mean value of the distribution</p></dd> <dt>float <i class="arg">stdev</i></dt> <dd><p>- Standard deviation of the distribution</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="73"><b class="cmd">::math::statistics::cdf-lognormal</b> <i class="arg">mean</i> <i class="arg">stdev</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a log-normal distribution with given mean and standard deviation, that is the probability for values up to the given one.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">mean</i></dt> <dd><p>- Mean value of the distribution</p></dd> <dt>float <i class="arg">stdev</i></dt> <dd><p>- Standard deviation of the distribution</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="74"><b class="cmd">::math::statistics::cdf-exponential</b> <i class="arg">mean</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for an exponential distribution with given mean.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">mean</i></dt> <dd><p>- Mean value of the distribution</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="75"><b class="cmd">::math::statistics::cdf-uniform</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a uniform distribution with given extremes.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Minimum value of the distribution</p></dd> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Maximum value of the distribution</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="76"><b class="cmd">::math::statistics::cdf-triangular</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a triangular distribution with given extremes. If xmin < xmax, then lower values have a higher probability and vice versa, see also <em>pdf-triangular</em></p> <dl class="doctools_arguments"> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Minimum value of the distribution</p></dd> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Maximum value of the distribution</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="77"><b class="cmd">::math::statistics::cdf-symmetric-triangular</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a symmetric triangular distribution with given extremes.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Minimum value of the distribution</p></dd> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Maximum value of the distribution</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="78"><b class="cmd">::math::statistics::cdf-students-t</b> <i class="arg">degrees</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a Student's t distribution with given number of degrees.</p> <dl class="doctools_arguments"> <dt>int <i class="arg">degrees</i></dt> <dd><p>- Number of degrees of freedom</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="79"><b class="cmd">::math::statistics::cdf-gamma</b> <i class="arg">alpha</i> <i class="arg">beta</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a Gamma distribution with given shape and rate parameters.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">alpha</i></dt> <dd><p>- Shape parameter</p></dd> <dt>float <i class="arg">beta</i></dt> <dd><p>- Rate parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the cumulative probability is required</p></dd> </dl></dd> <dt><a name="80"><b class="cmd">::math::statistics::cdf-poisson</b> <i class="arg">mu</i> <i class="arg">k</i></a></dt> <dd><p>Return the cumulative probability of a given number of occurrences in the same interval (k) for a Poisson distribution with given mean (mu).</p> <dl class="doctools_arguments"> <dt>float <i class="arg">mu</i></dt> <dd><p>- Mean number of occurrences</p></dd> <dt>int <i class="arg">k</i></dt> <dd><p>- Number of occurences</p></dd> </dl></dd> <dt><a name="81"><b class="cmd">::math::statistics::cdf-beta</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a Beta distribution with given shape parameters</p> <dl class="doctools_arguments"> <dt>float <i class="arg">a</i></dt> <dd><p>- First shape parameter</p></dd> <dt>float <i class="arg">b</i></dt> <dd><p>- Second shape parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="82"><b class="cmd">::math::statistics::cdf-weibull</b> <i class="arg">scale</i> <i class="arg">shape</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a Weibull distribution with given scale and shape parameters.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">scale</i></dt> <dd><p>- Scale parameter</p></dd> <dt>float <i class="arg">shape</i></dt> <dd><p>- Shape parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="83"><b class="cmd">::math::statistics::cdf-gumbel</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a Gumbel distribution with given location and scale parameters.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">location</i></dt> <dd><p>- Location parameter</p></dd> <dt>float <i class="arg">scale</i></dt> <dd><p>- Scale parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="84"><b class="cmd">::math::statistics::cdf-pareto</b> <i class="arg">scale</i> <i class="arg">shape</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a Pareto distribution with given scale and shape parameters</p> <dl class="doctools_arguments"> <dt>float <i class="arg">scale</i></dt> <dd><p>- Scale parameter</p></dd> <dt>float <i class="arg">shape</i></dt> <dd><p>- Shape parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="85"><b class="cmd">::math::statistics::cdf-cauchy</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a Cauchy distribution with given location and scale parameters.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">location</i></dt> <dd><p>- Location parameter</p></dd> <dt>float <i class="arg">scale</i></dt> <dd><p>- Scale parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="86"><b class="cmd">::math::statistics::cdf-F</b> <i class="arg">nf1</i> <i class="arg">nf2</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for an F distribution with nf1 and nf2 degrees of freedom.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">nf1</i></dt> <dd><p>- Degrees of freedom for the numerator</p></dd> <dt>float <i class="arg">nf2</i></dt> <dd><p>- Degrees of freedom for the denominator</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="87"><b class="cmd">::math::statistics::cdf-laplace</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a Laplace distribution with given location and shape parameters. The Laplace distribution consists of two exponential functions, is peaked and has heavier tails than the normal distribution.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">location</i></dt> <dd><p>- Location parameter (mean)</p></dd> <dt>float <i class="arg">scale</i></dt> <dd><p>- Shape parameter</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="88"><b class="cmd">::math::statistics::cdf-kumaraswamy</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a Kumaraswamy distribution with given parameters a and b. The Kumaraswamy distribution is related to the Beta distribution, but has a tractable cumulative distribution function.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">a</i></dt> <dd><p>- Parameter a</p></dd> <dt>float <i class="arg">b</i></dt> <dd><p>- Parameter b</p></dd> <dt>float <i class="arg">value</i></dt> <dd><p>- Value for which the probability is required</p></dd> </dl></dd> <dt><a name="89"><b class="cmd">::math::statistics::cdf-negative-binomial</b> <i class="arg">r</i> <i class="arg">p</i> <i class="arg">value</i></a></dt> <dd><p>Return the cumulative probability of a given value for a negative binomial distribution with an allowed number of failures and the probability of success.</p> <dl class="doctools_arguments"> <dt>int <i class="arg">r</i></dt> <dd><p>- Allowed number of failures (at least 1)</p></dd> <dt>float <i class="arg">p</i></dt> <dd><p>- Probability of success</p></dd> <dt>int <i class="arg">value</i></dt> <dd><p>- Greatest number of successes</p></dd> </dl></dd> <dt><a name="90"><b class="cmd">::math::statistics::empirical-distribution</b> <i class="arg">values</i></a></dt> <dd><p>Return a list of values and their empirical probability. The values are sorted in increasing order. (The implementation follows the description at the corresponding Wikipedia page)</p> <dl class="doctools_arguments"> <dt>list <i class="arg">values</i></dt> <dd><p>- List of data to be examined</p></dd> </dl></dd> <dt><a name="91"><b class="cmd">::math::statistics::random-normal</b> <i class="arg">mean</i> <i class="arg">stdev</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a normal distribution with given mean and standard deviation.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">mean</i></dt> <dd><p>- Mean value of the distribution</p></dd> <dt>float <i class="arg">stdev</i></dt> <dd><p>- Standard deviation of the distribution</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="92"><b class="cmd">::math::statistics::random-lognormal</b> <i class="arg">mean</i> <i class="arg">stdev</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a log-normal distribution with given mean and standard deviation.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">mean</i></dt> <dd><p>- Mean value of the distribution</p></dd> <dt>float <i class="arg">stdev</i></dt> <dd><p>- Standard deviation of the distribution</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="93"><b class="cmd">::math::statistics::random-exponential</b> <i class="arg">mean</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying an exponential distribution with given mean.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">mean</i></dt> <dd><p>- Mean value of the distribution</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="94"><b class="cmd">::math::statistics::random-uniform</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a uniform distribution with given extremes.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Minimum value of the distribution</p></dd> <dt>float <i class="arg">xmax</i></dt> <dd><p>- Maximum value of the distribution</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="95"><b class="cmd">::math::statistics::random-triangular</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a triangular distribution with given extremes. If xmin < xmax, then lower values have a higher probability and vice versa (see also <em>pdf-triangular</em>.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Minimum value of the distribution</p></dd> <dt>float <i class="arg">xmax</i></dt> <dd><p>- Maximum value of the distribution</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="96"><b class="cmd">::math::statistics::random-symmetric-triangular</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a symmetric triangular distribution with given extremes.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Minimum value of the distribution</p></dd> <dt>float <i class="arg">xmax</i></dt> <dd><p>- Maximum value of the distribution</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="97"><b class="cmd">::math::statistics::random-gamma</b> <i class="arg">alpha</i> <i class="arg">beta</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a Gamma distribution with given shape and rate parameters.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">alpha</i></dt> <dd><p>- Shape parameter</p></dd> <dt>float <i class="arg">beta</i></dt> <dd><p>- Rate parameter</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="98"><b class="cmd">::math::statistics::random-poisson</b> <i class="arg">mu</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a Poisson distribution with given mean.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">mu</i></dt> <dd><p>- Mean of the distribution</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="99"><b class="cmd">::math::statistics::random-chisquare</b> <i class="arg">df</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a chi square distribution with given degrees of freedom.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">df</i></dt> <dd><p>- Degrees of freedom</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="100"><b class="cmd">::math::statistics::random-student-t</b> <i class="arg">df</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a Student's t distribution with given degrees of freedom.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">df</i></dt> <dd><p>- Degrees of freedom</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="101"><b class="cmd">::math::statistics::random-beta</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a Beta distribution with given shape parameters.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">a</i></dt> <dd><p>- First shape parameter</p></dd> <dt>float <i class="arg">b</i></dt> <dd><p>- Second shape parameter</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="102"><b class="cmd">::math::statistics::random-weibull</b> <i class="arg">scale</i> <i class="arg">shape</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a Weibull distribution with given scale and shape parameters.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">scale</i></dt> <dd><p>- Scale parameter</p></dd> <dt>float <i class="arg">shape</i></dt> <dd><p>- Shape parameter</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="103"><b class="cmd">::math::statistics::random-gumbel</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a Gumbel distribution with given location and scale parameters.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">location</i></dt> <dd><p>- Location parameter</p></dd> <dt>float <i class="arg">scale</i></dt> <dd><p>- Scale parameter</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="104"><b class="cmd">::math::statistics::random-pareto</b> <i class="arg">scale</i> <i class="arg">shape</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a Pareto distribution with given scale and shape parameters.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">scale</i></dt> <dd><p>- Scale parameter</p></dd> <dt>float <i class="arg">shape</i></dt> <dd><p>- Shape parameter</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="105"><b class="cmd">::math::statistics::random-cauchy</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a Cauchy distribution with given location and scale parameters.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">location</i></dt> <dd><p>- Location parameter</p></dd> <dt>float <i class="arg">scale</i></dt> <dd><p>- Scale parameter</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="106"><b class="cmd">::math::statistics::random-laplace</b> <i class="arg">location</i> <i class="arg">scale</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisfying a Laplace distribution with given location and shape parameters. The Laplace distribution consists of two exponential functions, is peaked and has heavier tails than the normal distribution.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">location</i></dt> <dd><p>- Location parameter (mean)</p></dd> <dt>float <i class="arg">scale</i></dt> <dd><p>- Shape parameter</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="107"><b class="cmd">::math::statistics::random-kumaraswamy</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisying a Kumaraswamy distribution with given parameters a and b. The Kumaraswamy distribution is related to the Beta distribution, but has a tractable cumulative distribution function.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">a</i></dt> <dd><p>- Parameter a</p></dd> <dt>float <i class="arg">b</i></dt> <dd><p>- Parameter b</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="108"><b class="cmd">::math::statistics::random-negative-binomial</b> <i class="arg">r</i> <i class="arg">p</i> <i class="arg">number</i></a></dt> <dd><p>Return a list of "number" random values satisying a negative binomial distribution.</p> <dl class="doctools_arguments"> <dt>int <i class="arg">r</i></dt> <dd><p>- Allowed number of failures (at least 1)</p></dd> <dt>float <i class="arg">p</i></dt> <dd><p>- Probability of success</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Number of values to be returned</p></dd> </dl></dd> <dt><a name="109"><b class="cmd">::math::statistics::histogram-uniform</b> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">limits</i> <i class="arg">number</i></a></dt> <dd><p>Return the expected histogram for a uniform distribution.</p> <dl class="doctools_arguments"> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Minimum value of the distribution</p></dd> <dt>float <i class="arg">xmax</i></dt> <dd><p>- Maximum value of the distribution</p></dd> <dt>list <i class="arg">limits</i></dt> <dd><p>- Upper limits for the buckets in the histogram</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- Total number of "observations" in the histogram</p></dd> </dl></dd> <dt><a name="110"><b class="cmd">::math::statistics::incompleteGamma</b> <i class="arg">x</i> <i class="arg">p</i> <span class="opt">?tol?</span></a></dt> <dd><p>Evaluate the incomplete Gamma integral</p> <pre class="doctools_example"> 1 / x p-1 P(p,x) = -------- | dt exp(-t) * t Gamma(p) / 0 </pre> <dl class="doctools_arguments"> <dt>float <i class="arg">x</i></dt> <dd><p>- Value of x (limit of the integral)</p></dd> <dt>float <i class="arg">p</i></dt> <dd><p>- Value of p in the integrand</p></dd> <dt>float <i class="arg">tol</i></dt> <dd><p>- Required tolerance (default: 1.0e-9)</p></dd> </dl></dd> <dt><a name="111"><b class="cmd">::math::statistics::incompleteBeta</b> <i class="arg">a</i> <i class="arg">b</i> <i class="arg">x</i> <span class="opt">?tol?</span></a></dt> <dd><p>Evaluate the incomplete Beta integral</p> <dl class="doctools_arguments"> <dt>float <i class="arg">a</i></dt> <dd><p>- First shape parameter</p></dd> <dt>float <i class="arg">b</i></dt> <dd><p>- Second shape parameter</p></dd> <dt>float <i class="arg">x</i></dt> <dd><p>- Value of x (limit of the integral)</p></dd> <dt>float <i class="arg">tol</i></dt> <dd><p>- Required tolerance (default: 1.0e-9)</p></dd> </dl></dd> <dt><a name="112"><b class="cmd">::math::statistics::estimate-pareto</b> <i class="arg">values</i></a></dt> <dd><p>Estimate the parameters for the Pareto distribution that comes closest to the given values. Returns the estimated scale and shape parameters, as well as the standard error for the shape parameter.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">values</i></dt> <dd><p>- List of values, assumed to be distributed according to a Pareto distribution</p></dd> </dl></dd> <dt><a name="113"><b class="cmd">::math::statistics::estimate-exponential</b> <i class="arg">values</i></a></dt> <dd><p>Estimate the parameter for the exponential distribution that comes closest to the given values. Returns an estimate of the one parameter and of the standard error.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">values</i></dt> <dd><p>- List of values, assumed to be distributed according to an exponential distribution</p></dd> </dl></dd> <dt><a name="114"><b class="cmd">::math::statistics::estimate-laplace</b> <i class="arg">values</i></a></dt> <dd><p>Estimate the parameters for the Laplace distribution that comes closest to the given values. Returns an estimate of respectively the location and scale parameters, based on maximum likelihood.</p> <dl class="doctools_arguments"> <dt>list <i class="arg">values</i></dt> <dd><p>- List of values, assumed to be distributed according to an exponential distribution</p></dd> </dl></dd> <dt><a name="115"><b class="cmd">::math::statistics::estimante-negative-binomial</b> <i class="arg">r</i> <i class="arg">values</i></a></dt> <dd><p>Estimate the probability of success for the negative binomial distribution that comes closest to the given values. The allowed number of failures must be given.</p> <dl class="doctools_arguments"> <dt>int <i class="arg">r</i></dt> <dd><p>- Allowed number of failures (at least 1)</p></dd> <dt>int <i class="arg">number</i></dt> <dd><p>- List of values, assumed to be distributed according to a negative binomial distribution.</p></dd> </dl></dd> </dl> <p>TO DO: more function descriptions to be added</p> </div> <div id="section5" class="doctools_section"><h2><a name="section5">DATA MANIPULATION</a></h2> <p>The data manipulation procedures act on lists or lists of lists:</p> <dl class="doctools_definitions"> <dt><a name="116"><b class="cmd">::math::statistics::filter</b> <i class="arg">varname</i> <i class="arg">data</i> <i class="arg">expression</i></a></dt> <dd><p>Return a list consisting of the data for which the logical expression is true (this command works analogously to the command <b class="cmd"><a href="../../../../index.html#foreach">foreach</a></b>).</p> <dl class="doctools_arguments"> <dt>string <i class="arg">varname</i></dt> <dd><p>- Name of the variable used in the expression</p></dd> <dt>list <i class="arg">data</i></dt> <dd><p>- List of data</p></dd> <dt>string <i class="arg">expression</i></dt> <dd><p>- Logical expression using the variable name</p></dd> </dl></dd> <dt><a name="117"><b class="cmd">::math::statistics::map</b> <i class="arg">varname</i> <i class="arg">data</i> <i class="arg">expression</i></a></dt> <dd><p>Return a list consisting of the data that are transformed via the expression.</p> <dl class="doctools_arguments"> <dt>string <i class="arg">varname</i></dt> <dd><p>- Name of the variable used in the expression</p></dd> <dt>list <i class="arg">data</i></dt> <dd><p>- List of data</p></dd> <dt>string <i class="arg">expression</i></dt> <dd><p>- Expression to be used to transform (map) the data</p></dd> </dl></dd> <dt><a name="118"><b class="cmd">::math::statistics::samplescount</b> <i class="arg">varname</i> <i class="arg">list</i> <i class="arg">expression</i></a></dt> <dd><p>Return a list consisting of the <i class="term">counts</i> of all data in the sublists of the "list" argument for which the expression is true.</p> <dl class="doctools_arguments"> <dt>string <i class="arg">varname</i></dt> <dd><p>- Name of the variable used in the expression</p></dd> <dt>list <i class="arg">data</i></dt> <dd><p>- List of sublists, each containing the data</p></dd> <dt>string <i class="arg">expression</i></dt> <dd><p>- Logical expression to test the data (defaults to "true").</p></dd> </dl></dd> <dt><a name="119"><b class="cmd">::math::statistics::subdivide</b></a></dt> <dd><p>Routine <em>PM</em> - not implemented yet</p></dd> </dl> </div> <div id="section6" class="doctools_section"><h2><a name="section6">PLOT PROCEDURES</a></h2> <p>The following simple plotting procedures are available:</p> <dl class="doctools_definitions"> <dt><a name="120"><b class="cmd">::math::statistics::plot-scale</b> <i class="arg">canvas</i> <i class="arg">xmin</i> <i class="arg">xmax</i> <i class="arg">ymin</i> <i class="arg">ymax</i></a></dt> <dd><p>Set the scale for a plot in the given canvas. All plot routines expect this function to be called first. There is no automatic scaling provided.</p> <dl class="doctools_arguments"> <dt>widget <i class="arg">canvas</i></dt> <dd><p>- Canvas widget to use</p></dd> <dt>float <i class="arg">xmin</i></dt> <dd><p>- Minimum x value</p></dd> <dt>float <i class="arg">xmax</i></dt> <dd><p>- Maximum x value</p></dd> <dt>float <i class="arg">ymin</i></dt> <dd><p>- Minimum y value</p></dd> <dt>float <i class="arg">ymax</i></dt> <dd><p>- Maximum y value</p></dd> </dl></dd> <dt><a name="121"><b class="cmd">::math::statistics::plot-xydata</b> <i class="arg">canvas</i> <i class="arg">xdata</i> <i class="arg">ydata</i> <i class="arg">tag</i></a></dt> <dd><p>Create a simple XY plot in the given canvas - the data are shown as a collection of dots. The tag can be used to manipulate the appearance.</p> <dl class="doctools_arguments"> <dt>widget <i class="arg">canvas</i></dt> <dd><p>- Canvas widget to use</p></dd> <dt>float <i class="arg">xdata</i></dt> <dd><p>- Series of independent data</p></dd> <dt>float <i class="arg">ydata</i></dt> <dd><p>- Series of dependent data</p></dd> <dt>string <i class="arg">tag</i></dt> <dd><p>- Tag to give to the plotted data (defaults to xyplot)</p></dd> </dl></dd> <dt><a name="122"><b class="cmd">::math::statistics::plot-xyline</b> <i class="arg">canvas</i> <i class="arg">xdata</i> <i class="arg">ydata</i> <i class="arg">tag</i></a></dt> <dd><p>Create a simple XY plot in the given canvas - the data are shown as a line through the data points. The tag can be used to manipulate the appearance.</p> <dl class="doctools_arguments"> <dt>widget <i class="arg">canvas</i></dt> <dd><p>- Canvas widget to use</p></dd> <dt>list <i class="arg">xdata</i></dt> <dd><p>- Series of independent data</p></dd> <dt>list <i class="arg">ydata</i></dt> <dd><p>- Series of dependent data</p></dd> <dt>string <i class="arg">tag</i></dt> <dd><p>- Tag to give to the plotted data (defaults to xyplot)</p></dd> </dl></dd> <dt><a name="123"><b class="cmd">::math::statistics::plot-tdata</b> <i class="arg">canvas</i> <i class="arg">tdata</i> <i class="arg">tag</i></a></dt> <dd><p>Create a simple XY plot in the given canvas - the data are shown as a collection of dots. The horizontal coordinate is equal to the index. The tag can be used to manipulate the appearance. This type of presentation is suitable for autocorrelation functions for instance or for inspecting the time-dependent behaviour.</p> <dl class="doctools_arguments"> <dt>widget <i class="arg">canvas</i></dt> <dd><p>- Canvas widget to use</p></dd> <dt>list <i class="arg">tdata</i></dt> <dd><p>- Series of dependent data</p></dd> <dt>string <i class="arg">tag</i></dt> <dd><p>- Tag to give to the plotted data (defaults to xyplot)</p></dd> </dl></dd> <dt><a name="124"><b class="cmd">::math::statistics::plot-tline</b> <i class="arg">canvas</i> <i class="arg">tdata</i> <i class="arg">tag</i></a></dt> <dd><p>Create a simple XY plot in the given canvas - the data are shown as a line. See plot-tdata for an explanation.</p> <dl class="doctools_arguments"> <dt>widget <i class="arg">canvas</i></dt> <dd><p>- Canvas widget to use</p></dd> <dt>list <i class="arg">tdata</i></dt> <dd><p>- Series of dependent data</p></dd> <dt>string <i class="arg">tag</i></dt> <dd><p>- Tag to give to the plotted data (defaults to xyplot)</p></dd> </dl></dd> <dt><a name="125"><b class="cmd">::math::statistics::plot-histogram</b> <i class="arg">canvas</i> <i class="arg">counts</i> <i class="arg">limits</i> <i class="arg">tag</i></a></dt> <dd><p>Create a simple histogram in the given canvas</p> <dl class="doctools_arguments"> <dt>widget <i class="arg">canvas</i></dt> <dd><p>- Canvas widget to use</p></dd> <dt>list <i class="arg">counts</i></dt> <dd><p>- Series of bucket counts</p></dd> <dt>list <i class="arg">limits</i></dt> |
︙ | ︙ |
Changes to idoc/www/tcllib/files/modules/practcl/practcl.html.
︙ | ︙ | |||
103 104 105 106 107 108 109 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> | | | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> <h1 class="doctools_title">practcl(n) 0.16.4 tcllib "The The Proper Rational API for C to Tool Command Language Module"</h1> <div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> <p>practcl - The Practcl Module</p> </div> <div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> <ul class="doctools_toc"> <li class="doctools_section"><a href="#toc">Table Of Contents</a></li> <li class="doctools_section"><a href="#synopsis">Synopsis</a></li> |
︙ | ︙ | |||
526 527 528 529 530 531 532 | <dt><a name="15">proc <b class="cmd">practcl::mkzip</b> <i class="arg">exename</i> <i class="arg">barekit</i> <i class="arg">vfspath</i></a></dt> <dd><p>Build a zipfile. On tcl8.6 this invokes the native Zip implementation on older interpreters this invokes zip via exec</p></dd> <dt><a name="16">proc <b class="cmd">practcl::sort_dict</b> <i class="arg">list</i></a></dt> <dd><p>Dictionary sort a key/value list. Needed because pre tcl8.6 does not have <em>lsort -stride 2</em></p></dd> <dt><a name="17">proc <b class="cmd">practcl::local_os</b></a></dt> | > > > > > > > > > > > > > > > > > > > > > > > > > > | > | > > > > > > | > > > > > > > > > > > > > > > > | | 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 | <dt><a name="15">proc <b class="cmd">practcl::mkzip</b> <i class="arg">exename</i> <i class="arg">barekit</i> <i class="arg">vfspath</i></a></dt> <dd><p>Build a zipfile. On tcl8.6 this invokes the native Zip implementation on older interpreters this invokes zip via exec</p></dd> <dt><a name="16">proc <b class="cmd">practcl::sort_dict</b> <i class="arg">list</i></a></dt> <dd><p>Dictionary sort a key/value list. Needed because pre tcl8.6 does not have <em>lsort -stride 2</em></p></dd> <dt><a name="17">proc <b class="cmd">practcl::local_os</b></a></dt> <dd><p>Returns a dictionary describing the local operating system. Fields return include:</p> <ul class="doctools_itemized"> <li><p>download - Filesystem path where fossil repositories and source tarballs are downloaded for the current user</p></li> <li><p>EXEEXT - The extension to give to executables. (i.e. .exe on windows)</p></li> <li><p>fossil_mirror - A URI for a local network web server who acts as a fossil repository mirror</p></li> <li><p>local_install - Filesystem path where packages for local consumption by the current user are installed</p></li> <li><p>prefix - The prefix as given to the Tcl core/TEA for installation to local_install in ./configure</p></li> <li><p>sandbox - The file location where this project unpacks external projects</p></li> <li><p>TEACUP_PROFILE - The ActiveState/Teacup canonical name for this platform (i.e. win32-ix86 macosx10.5-i386-x86_84)</p></li> <li><p>TEACUP_OS - The local operating system (windows, macosx, openbsd, etc). Gives the same answer as tcl.m4, except that macosx is given as macosx instead of Darwin.</p></li> <li><p>TEA_PLATFORM - The platform returned by uname -s-uname -r (on Unix), or "windows" on Windows</p></li> <li><p>TEACUP_ARCH - The processor architecture for the local os (i.e. ix86, x86_64)</p></li> <li><p>TEACUP_ARCH - The processor architecture for the local os (i.e. ix86, x86_64)</p></li> <li><p>teapot - Filesystem path where teapot package files are downloaded for the current user</p></li> <li><p>userhome - File path to store localized preferences, cache download files, etc for the current user</p></li> </ul> <p>This command uses a combination of local checks with Exec, any tclConfig.sh file that is resident, autoconf data where already computed, and data gleaned from a file named practcl.rc in userhome. The location for userhome varies by platform and operating system:</p> <ul class="doctools_itemized"> <li><p>Windows: ::env(LOCALAPPDATA)/Tcl</p></li> <li><p>Macos: ~/Library/Application Support/Tcl</p></li> <li><p>Other: ~/tcl</p></li> </ul></dd> <dt><a name="18">proc <b class="cmd">practcl::config.tcl</b> <i class="arg">path</i></a></dt> <dd><p>A transparent call to ::practcl::read_configuration to preserve backward compadibility with older copies of Practcl</p></dd> <dt><a name="19">proc <b class="cmd">practcl::read_configuration</b> <i class="arg">path</i></a></dt> <dd><p>Detect local platform. This command looks for data gleaned by autoconf or autosetup in the path specified, or perform its own logic tests if neither has been run. A file named config.site present in the location indicates that this project is cross compiling, and the data stored in that file is used for the compiler and linker.</p> <p>This command looks for information from the following files, in the following order:</p> <ul class="doctools_itemized"> <li><p>config.tcl - A file generated by autoconf/configure in newer editions of TEA, encoded as a Tcl script.</p></li> <li><p>config.site - A file containing cross compiler information, encoded as a SH script</p></li> <li><p>::env(VisualStudioVersion) - On Windows, and environmental value that indicates MS Visual Studio is installed</p></li> </ul> <p>This command returns a dictionary containing all of the data cleaned from the sources above. In the absence of any guidance this command returns the same output as ::practcl::local_os. In this mode, if the environmental variable VisualStudioVersion exists, this command will provide a template of fields that are appropriate for compiling on Windows under Microsoft Visual Studio. The USEMSVC flag in the dictionary is a boolean flag to indicate if this is indeed the case.</p></dd> <dt><a name="20">proc <b class="cmd">practcl::tcllib_require</b> <i class="arg">pkg</i> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>Try to load a package, and failing that retrieve tcllib</p></dd> <dt><a name="21">proc <b class="cmd">practcl::platform::tcl_core_options</b> <i class="arg">os</i></a></dt> <dd><p>Return the string to pass to ./configure to compile the Tcl core for the given OS.</p> <ul class="doctools_itemized"> <li><p>windows: --with-tzdata --with-encoding utf-8</p></li> <li><p>macosx: --enable-corefoundation=yes --enable-framework=no --with-tzdata --with-encoding utf-8</p></li> <li><p>other: --with-tzdata --with-encoding utf-8</p></li> </ul></dd> <dt><a name="22">proc <b class="cmd">practcl::platform::tk_core_options</b> <i class="arg">os</i></a></dt> <dd></dd> <dt><a name="23">proc <b class="cmd">practcl::read_rc_file</b> <i class="arg">filename</i> <span class="opt">?<i class="arg">localdat</i> <b class="const"></b>?</span></a></dt> <dd><p>Read a stylized key/value list stored in a file</p></dd> <dt><a name="24">proc <b class="cmd">practcl::read_sh_subst</b> <i class="arg">line</i> <i class="arg">info</i></a></dt> <dd><p>Converts a XXX.sh file into a series of Tcl variables</p></dd> <dt><a name="25">proc <b class="cmd">practcl::read_sh_file</b> <i class="arg">filename</i> <span class="opt">?<i class="arg">localdat</i> <b class="const"></b>?</span></a></dt> |
︙ | ︙ | |||
595 596 597 598 599 600 601 | <dd><p>Delete the contents of <em>d2</em>, and then recusively Ccopy the contents of <em>d1</em> to <em>d2</em>.</p></dd> <dt><a name="42">proc <b class="cmd">practcl::copyDir</b> <i class="arg">d1</i> <i class="arg">d2</i> <span class="opt">?<i class="arg">toplevel</i> <b class="const">1</b>?</span></a></dt> <dd><p>Recursively copy the contents of <em>d1</em> to <em>d2</em></p></dd> <dt><a name="43">proc <b class="cmd">practcl::buildModule</b> <i class="arg">modpath</i></a></dt> <dd></dd> <dt><a name="44">proc <b class="cmd">practcl::installModule</b> <i class="arg">modpath</i> <i class="arg">DEST</i></a></dt> | > > > > > > > > > > > > > | | 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 | <dd><p>Delete the contents of <em>d2</em>, and then recusively Ccopy the contents of <em>d1</em> to <em>d2</em>.</p></dd> <dt><a name="42">proc <b class="cmd">practcl::copyDir</b> <i class="arg">d1</i> <i class="arg">d2</i> <span class="opt">?<i class="arg">toplevel</i> <b class="const">1</b>?</span></a></dt> <dd><p>Recursively copy the contents of <em>d1</em> to <em>d2</em></p></dd> <dt><a name="43">proc <b class="cmd">practcl::buildModule</b> <i class="arg">modpath</i></a></dt> <dd></dd> <dt><a name="44">proc <b class="cmd">practcl::installModule</b> <i class="arg">modpath</i> <i class="arg">DEST</i></a></dt> <dd><p>Install a module from MODPATH to the directory specified. <em>dpath</em> is assumed to be the fully qualified path where module is to be placed. Any existing files will be deleted at that path. If the path is symlink the process will return with no error and no action. If the module has contents in the build/ directory that are newer than the .tcl files in the module source directory, and a build/build.tcl file exists, the build/build.tcl file is run. If the source directory includes a file named index.tcl, the directory is assumed to be in the tao style of modules, and the entire directory (and all subdirectories) are copied verbatim. If no index.tcl file is present, all .tcl files are copied from the module source directory, and a pkgIndex.tcl file is generated if non yet exists. I a folder named htdocs exists in the source directory, that directory is copied verbatim to the destination.</p></dd> <dt><a name="45">proc <b class="cmd">practcl::trigger</b> <span class="opt">?<i class="arg">args</i>?</span></a></dt> <dd><p>Trigger build targets, and recompute dependencies</p> <p>Internals:</p> <pre class="doctools_example"> ::practcl::LOCAL make trigger {*}$args foreach {name obj} [::practcl::LOCAL make objects] { set ::make($name) [$obj do] |
︙ | ︙ |
Changes to idoc/www/tcllib/files/modules/profiler/profiler.html.
︙ | ︙ | |||
101 102 103 104 105 106 107 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> | | | | > > | 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> <h1 class="doctools_title">profiler(n) 0.5 tcllib "Tcl Profiler"</h1> <div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> <p>profiler - Tcl source code profiler</p> </div> <div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> <ul class="doctools_toc"> <li class="doctools_section"><a href="#toc">Table Of Contents</a></li> <li class="doctools_section"><a href="#synopsis">Synopsis</a></li> <li class="doctools_section"><a href="#section1">Description</a></li> <li class="doctools_section"><a href="#section2">COMMANDS</a></li> <li class="doctools_section"><a href="#section3">Bugs, Ideas, Feedback</a></li> <li class="doctools_section"><a href="#keywords">Keywords</a></li> <li class="doctools_section"><a href="#category">Category</a></li> </ul> </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> <li>package require <b class="pkgname">Tcl 8.3</b></li> <li>package require <b class="pkgname">profiler <span class="opt">?0.5?</span></b></li> </ul> <ul class="doctools_syntax"> <li><a href="#1"><b class="cmd">::profiler::init</b></a></li> <li><a href="#2"><b class="cmd">::profiler::dump</b> <i class="arg">pattern</i></a></li> <li><a href="#3"><b class="cmd">::profiler::print</b> <span class="opt">?<i class="arg">pattern</i>?</span></a></li> <li><a href="#4"><b class="cmd">::profiler::reset</b> <span class="opt">?<i class="arg">pattern</i>?</span></a></li> <li><a href="#5"><b class="cmd">::profiler::suspend</b> <span class="opt">?<i class="arg">pattern</i>?</span></a></li> <li><a href="#6"><b class="cmd">::profiler::resume</b> <span class="opt">?<i class="arg">pattern</i>?</span></a></li> <li><a href="#7"><b class="cmd">::profiler::new-disabled</b></a></li> <li><a href="#8"><b class="cmd">::profiler::new-enabled</b></a></li> <li><a href="#9"><b class="cmd">::profiler::sortFunctions</b> <i class="arg">key</i></a></li> </ul> </div> </div> <div id="section1" class="doctools_section"><h2><a name="section1">Description</a></h2> <p>The <b class="package">profiler</b> package provides a simple Tcl source code profiler. It is a function-level profiler; that is, it collects only function-level information, not the more detailed line-level |
︙ | ︙ | |||
193 194 195 196 197 198 199 | has been gathered previously. Use resume command to re-enable profiling.</p></dd> <dt><a name="6"><b class="cmd">::profiler::resume</b> <span class="opt">?<i class="arg">pattern</i>?</span></a></dt> <dd><p>Resume profiling for all functions matching <i class="arg">pattern</i>. If no pattern is specified, profiling will be resumed for all functions. This command should be invoked after suspending the profiler in the code.</p></dd> | > > > > > > > > > > | | 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 | has been gathered previously. Use resume command to re-enable profiling.</p></dd> <dt><a name="6"><b class="cmd">::profiler::resume</b> <span class="opt">?<i class="arg">pattern</i>?</span></a></dt> <dd><p>Resume profiling for all functions matching <i class="arg">pattern</i>. If no pattern is specified, profiling will be resumed for all functions. This command should be invoked after suspending the profiler in the code.</p></dd> <dt><a name="7"><b class="cmd">::profiler::new-disabled</b></a></dt> <dd><p>Change the initial profiling state for new procedures. Invoking this command disables profiling for all procedures created after this command until <b class="cmd">new-enabled</b> is invoked. Activate profiling of specific procedures via <b class="cmd">resume</b>.</p></dd> <dt><a name="8"><b class="cmd">::profiler::new-enabled</b></a></dt> <dd><p>Change the initial profiling state for new procedures. Invoking this command enables profiling for all procedures created after this command until <b class="cmd">new-disabled</b> is invoked. Prevent profiling of specific procedures via <b class="cmd">suspend</b>.</p></dd> <dt><a name="9"><b class="cmd">::profiler::sortFunctions</b> <i class="arg">key</i></a></dt> <dd><p>Return a list of functions sorted by a particular profiling statistic. Supported values for <i class="arg">key</i> are: <b class="const">calls</b>, <b class="const">exclusiveTime</b>, <b class="const">compileTime</b>, <b class="const">nonCompileTime</b>, <b class="const">totalRuntime</b>, <b class="const">avgExclusiveTime</b>, and <b class="const">avgRuntime</b>. The return result is a list of lists, where each sublist consists of a function name and the value of <i class="arg">key</i> for that function.</p></dd> |
︙ | ︙ |
Changes to idoc/www/tcllib/files/modules/struct/matrix.html.
︙ | ︙ | |||
89 90 91 92 93 94 95 | margin-bottom: 1em; border-bottom: 1px solid black; } --></style> </head> <!-- Generated from file 'matrix.man' by tcllib/doctools with format 'html' --> | | | | | 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | margin-bottom: 1em; border-bottom: 1px solid black; } --></style> </head> <!-- Generated from file 'matrix.man' by tcllib/doctools with format 'html' --> <!-- Copyright &copy; 2002-2013,2019 Andreas Kupries &lt;[email protected]&gt; --> <!-- struct::matrix.n --> <body><hr> [ <a href="../../../../../../../../home">Tcllib Home</a> | <a href="../../../../toc.html">Main Table Of Contents</a> | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> <h1 class="doctools_title">struct::matrix(n) 2.0.4 tcllib "Tcl Data Structures"</h1> <div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> <p>struct::matrix - Create and manipulate matrix objects</p> </div> <div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> <ul class="doctools_toc"> <li class="doctools_section"><a href="#toc">Table Of Contents</a></li> <li class="doctools_section"><a href="#synopsis">Synopsis</a></li> <li class="doctools_section"><a href="#section1">Description</a></li> <li class="doctools_section"><a href="#section2">EXAMPLES</a></li> <li class="doctools_section"><a href="#section3">Bugs, Ideas, Feedback</a></li> <li class="doctools_section"><a href="#keywords">Keywords</a></li> <li class="doctools_section"><a href="#category">Category</a></li> <li class="doctools_section"><a href="#copyright">Copyright</a></li> </ul> </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> <li>package require <b class="pkgname">Tcl 8.2</b></li> <li>package require <b class="pkgname">struct::matrix <span class="opt">?2.0.4?</span></b></li> </ul> <ul class="doctools_syntax"> <li><a href="#1"><b class="cmd">::struct::matrix</b> <span class="opt">?<i class="arg">matrixName</i>?</span> <span class="opt">?<b class="const">=</b>|<b class="const">:=</b>|<b class="const">as</b>|<b class="const">deserialize</b> <i class="arg">source</i>?</span></a></li> <li><a href="#2"><b class="cmd">matrixName</b> <i class="arg">option</i> <span class="opt">?<i class="arg">arg arg ...</i>?</span></a></li> <li><a href="#3"><i class="arg">matrixName</i> <b class="method">=</b> <i class="arg">sourcematrix</i></a></li> <li><a href="#4"><i class="arg">matrixName</i> <b class="method">--></b> <i class="arg">destmatrix</i></a></li> <li><a href="#5"><i class="arg">matrixName</i> <b class="method">add column</b> <span class="opt">?<i class="arg">values</i>?</span></a></li> |
︙ | ︙ | |||
558 559 560 561 562 563 564 | <div id="keywords" class="doctools_section"><h2><a name="keywords">Keywords</a></h2> <p><a href="../../../../index.html#matrix">matrix</a></p> </div> <div id="category" class="doctools_section"><h2><a name="category">Category</a></h2> <p>Data structures</p> </div> <div id="copyright" class="doctools_section"><h2><a name="copyright">Copyright</a></h2> | | | 558 559 560 561 562 563 564 565 566 567 | <div id="keywords" class="doctools_section"><h2><a name="keywords">Keywords</a></h2> <p><a href="../../../../index.html#matrix">matrix</a></p> </div> <div id="category" class="doctools_section"><h2><a name="category">Category</a></h2> <p>Data structures</p> </div> <div id="copyright" class="doctools_section"><h2><a name="copyright">Copyright</a></h2> <p>Copyright © 2002-2013,2019 Andreas Kupries <[email protected]></p> </div> </div></body></html> |
Changes to idoc/www/tcllib/files/modules/struct/matrix1.html.
︙ | ︙ | |||
89 90 91 92 93 94 95 | margin-bottom: 1em; border-bottom: 1px solid black; } --></style> </head> <!-- Generated from file 'matrix1.man' by tcllib/doctools with format 'html' --> | | | | | 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | margin-bottom: 1em; border-bottom: 1px solid black; } --></style> </head> <!-- Generated from file 'matrix1.man' by tcllib/doctools with format 'html' --> <!-- Copyright &copy; 2002,2019 Andreas Kupries &lt;[email protected]&gt; --> <!-- struct::matrix_v1.n --> <body><hr> [ <a href="../../../../../../../../home">Tcllib Home</a> | <a href="../../../../toc.html">Main Table Of Contents</a> | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> <h1 class="doctools_title">struct::matrix_v1(n) 1.2.2 tcllib "Tcl Data Structures"</h1> <div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> <p>struct::matrix_v1 - Create and manipulate matrix objects</p> </div> <div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> <ul class="doctools_toc"> <li class="doctools_section"><a href="#toc">Table Of Contents</a></li> <li class="doctools_section"><a href="#synopsis">Synopsis</a></li> <li class="doctools_section"><a href="#section1">Description</a></li> <li class="doctools_section"><a href="#section2">EXAMPLES</a></li> <li class="doctools_section"><a href="#section3">Bugs, Ideas, Feedback</a></li> <li class="doctools_section"><a href="#keywords">Keywords</a></li> <li class="doctools_section"><a href="#category">Category</a></li> <li class="doctools_section"><a href="#copyright">Copyright</a></li> </ul> </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> <li>package require <b class="pkgname">Tcl 8.2</b></li> <li>package require <b class="pkgname">struct::matrix <span class="opt">?1.2.2?</span></b></li> </ul> <ul class="doctools_syntax"> <li><a href="#1"><b class="cmd">matrixName</b> <i class="arg">option</i> <span class="opt">?<i class="arg">arg arg ...</i>?</span></a></li> <li><a href="#2"><i class="arg">matrixName</i> <b class="method">add column</b> <span class="opt">?<i class="arg">values</i>?</span></a></li> <li><a href="#3"><i class="arg">matrixName</i> <b class="method">add row</b> <span class="opt">?<i class="arg">values</i>?</span></a></li> <li><a href="#4"><i class="arg">matrixName</i> <b class="method">add columns</b> <i class="arg">n</i></a></li> <li><a href="#5"><i class="arg">matrixName</i> <b class="method">add rows</b> <i class="arg">n</i></a></li> |
︙ | ︙ | |||
446 447 448 449 450 451 452 | <div id="keywords" class="doctools_section"><h2><a name="keywords">Keywords</a></h2> <p><a href="../../../../index.html#matrix">matrix</a></p> </div> <div id="category" class="doctools_section"><h2><a name="category">Category</a></h2> <p>Data structures</p> </div> <div id="copyright" class="doctools_section"><h2><a name="copyright">Copyright</a></h2> | | | 446 447 448 449 450 451 452 453 454 455 | <div id="keywords" class="doctools_section"><h2><a name="keywords">Keywords</a></h2> <p><a href="../../../../index.html#matrix">matrix</a></p> </div> <div id="category" class="doctools_section"><h2><a name="category">Category</a></h2> <p>Data structures</p> </div> <div id="copyright" class="doctools_section"><h2><a name="copyright">Copyright</a></h2> <p>Copyright © 2002,2019 Andreas Kupries <[email protected]></p> </div> </div></body></html> |
Changes to idoc/www/tcllib/files/modules/virtchannel_base/halfpipe.html.
︙ | ︙ | |||
89 90 91 92 93 94 95 | margin-bottom: 1em; border-bottom: 1px solid black; } --></style> </head> <!-- Generated from file 'halfpipe.man' by tcllib/doctools with format 'html' --> | | | | 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | margin-bottom: 1em; border-bottom: 1px solid black; } --></style> </head> <!-- Generated from file 'halfpipe.man' by tcllib/doctools with format 'html' --> <!-- Copyright &copy; 2009, 2019 Andreas Kupries &lt;[email protected]&gt; --> <!-- tcl::chan::halfpipe.n --> <body><hr> [ <a href="../../../../../../../../home">Tcllib Home</a> | <a href="../../../../toc.html">Main Table Of Contents</a> | <a href="../../../toc.html">Table Of Contents</a> | <a href="../../../../index.html">Keyword Index</a> | <a href="../../../../toc0.html">Categories</a> | <a href="../../../../toc1.html">Modules</a> | <a href="../../../../toc2.html">Applications</a> ] <hr> <div class="doctools"> <h1 class="doctools_title">tcl::chan::halfpipe(n) 1.0.1 tcllib "Reflected/virtual channel support"</h1> <div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> <p>tcl::chan::halfpipe - In-memory channel, half of a fifo2</p> </div> <div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> <ul class="doctools_toc"> <li class="doctools_section"><a href="#toc">Table Of Contents</a></li> <li class="doctools_section"><a href="#synopsis">Synopsis</a></li> |
︙ | ︙ | |||
126 127 128 129 130 131 132 | </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> <li>package require <b class="pkgname">Tcl 8.5</b></li> <li>package require <b class="pkgname">TclOO</b></li> <li>package require <b class="pkgname">tcl::chan::events <span class="opt">?1?</span></b></li> | | < | 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | </div> <div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> <div class="doctools_synopsis"> <ul class="doctools_requirements"> <li>package require <b class="pkgname">Tcl 8.5</b></li> <li>package require <b class="pkgname">TclOO</b></li> <li>package require <b class="pkgname">tcl::chan::events <span class="opt">?1?</span></b></li> <li>package require <b class="pkgname">tcl::chan::halfpipe <span class="opt">?1.0.1?</span></b></li> </ul> <ul class="doctools_syntax"> <li><a href="#1"><b class="cmd">::tcl::chan::halfpipe</b> <span class="opt">?<b class="option">-option</b> <i class="arg">value</i>...?</span></a></li> <li><a href="#2"><i class="arg">objectCmd</i> <b class="method">put</b> <i class="arg">bytes</i></a></li> </ul> </div> </div> |
︙ | ︙ | |||
198 199 200 201 202 203 204 | <div id="keywords" class="doctools_section"><h2><a name="keywords">Keywords</a></h2> <p><a href="../../../../index.html#callbacks">callbacks</a>, <a href="../../../../index.html#fifo">fifo</a>, <a href="../../../../index.html#in_memory_channel">in-memory channel</a>, <a href="../../../../index.html#reflected_channel">reflected channel</a>, <a href="../../../../index.html#tip_219">tip 219</a>, <a href="../../../../index.html#virtual_channel">virtual channel</a></p> </div> <div id="category" class="doctools_section"><h2><a name="category">Category</a></h2> <p>Channels</p> </div> <div id="copyright" class="doctools_section"><h2><a name="copyright">Copyright</a></h2> | | | 197 198 199 200 201 202 203 204 205 206 | <div id="keywords" class="doctools_section"><h2><a name="keywords">Keywords</a></h2> <p><a href="../../../../index.html#callbacks">callbacks</a>, <a href="../../../../index.html#fifo">fifo</a>, <a href="../../../../index.html#in_memory_channel">in-memory channel</a>, <a href="../../../../index.html#reflected_channel">reflected channel</a>, <a href="../../../../index.html#tip_219">tip 219</a>, <a href="../../../../index.html#virtual_channel">virtual channel</a></p> </div> <div id="category" class="doctools_section"><h2><a name="category">Category</a></h2> <p>Channels</p> </div> <div id="copyright" class="doctools_section"><h2><a name="copyright">Copyright</a></h2> <p>Copyright © 2009, 2019 Andreas Kupries <[email protected]></p> </div> </div></body></html> |
Changes to modules/blowfish/blowfish.man.
1 | [comment {-*- tcl -*- doctools manpage}] | > | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [vset VERSION 1.0.5] [comment {-*- tcl -*- doctools manpage}] [manpage_begin blowfish n [vset VERSION]] [see_also 3des] [see_also des] [see_also rc4] [keywords {block cipher}] [keywords blowfish] [keywords cryptography] [keywords encryption] [keywords security] [copyright {2003, Pat Thoyts <[email protected]>}] [moddesc {Blowfish Block Cipher}] [titledesc {Implementation of the Blowfish block cipher}] [category {Hashes, checksums, and encryption}] [require Tcl 8.4] [require blowfish [opt [vset VERSION]]] [description] [para] This package is an implementation in Tcl of the Blowfish algorithm developed by Bruce Schneier [lb]1[rb]. Blowfish is a 64-bit block cipher designed to operate quickly on 32 bit architectures and accepting a variable key length. This implementation supports ECB and CBC mode |
︙ | ︙ |
Changes to modules/blowfish/blowfish.tcl.
︙ | ︙ | |||
505 506 507 508 509 510 511 | # proc ::blowfish::Chunk {Key in {out {}} {chunksize 4096} {pad \0}} { upvar #0 $Key state if {[eof $in]} { fileevent $in readable {} set state(reading) 0 | > | > > > | > | > > | > > > > > > > > | | > > > > > > > | | | 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 | # proc ::blowfish::Chunk {Key in {out {}} {chunksize 4096} {pad \0}} { upvar #0 $Key state if {[eof $in]} { fileevent $in readable {} set state(reading) 0 set data $state(remainder) # Only pad at the end of the stream. if {[string length $pad] > 0} { set data [Pad $data 8 $pad] } } else { set data [read $in $chunksize] #puts "Chunk: reading [string len $data] bytes" set data $state(remainder)$data # If data is not a multiple of 8, state(remainder) will hold # excess bytes for the next round. set pagedlen [expr {([string length $data] / 8) * 8}] set state(remainder) [string range $data $pagedlen end] incr pagedlen -1 set data [string range $data 0 $pagedlen] } if {![string length $data]} return if {[set code [catch { set cipher [$state(cmd) $Key $data] } msg]]} { fileevent $in readable {} set state(reading) 0 set state(err) [list $code $msg] return } if {$out == {}} { append state(output) $cipher } else { puts -nonewline $out $cipher } } # ------------------------------------------------------------------------- # LoadAccelerator -- # |
︙ | ︙ | |||
581 582 583 584 585 586 587 | } return $char } proc ::blowfish::Pad {data blocksize {fill \0}} { set len [string length $data] if {$len == 0} { | | | 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 | } return $char } proc ::blowfish::Pad {data blocksize {fill \0}} { set len [string length $data] if {$len == 0} { # do not pad an empty string } elseif {($len % $blocksize) != 0} { set pad [expr {$blocksize - ($len % $blocksize)}] append data [string repeat $fill $pad] } return $data } |
︙ | ︙ | |||
634 635 636 637 638 639 640 | if {$opts(-key) == {}} { return -code error "no key provided: the -key option is required" } set r {} if {$opts(-in) == {}} { | > | | 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 | if {$opts(-key) == {}} { return -code error "no key provided: the -key option is required" } set r {} if {$opts(-in) == {}} { # Immediate data (plain text is argument). if {[llength $args] != 1} { return -code error "wrong \# args:\ should be \"blowfish ?options...? -key keydata plaintext\"" } set data [lindex $args 0] if {[string length $opts(-pad)] > 0} { |
︙ | ︙ | |||
663 664 665 666 667 668 669 | if {$opts(-out) != {}} { puts -nonewline $opts(-out) $r set r {} } } else { | > | > > > > > > > | 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 | if {$opts(-out) != {}} { puts -nonewline $opts(-out) $r set r {} } } else { # Channel data (plain text is read from a binary channel). if {[llength $args] != 0} { return -code error "wrong \# args:\ should be \"blowfish ?options...? -key keydata -in channel\"" } set Key [Init $opts(-mode) $opts(-key) $opts(-iv)] upvar $Key state set state(reading) 1 if {[string equal $opts(-dir) "encrypt"]} { set state(cmd) Encrypt } else { set state(cmd) Decrypt } set state(output) "" set state(remainder) "" fileevent $opts(-in) readable \ [list [namespace origin Chunk] \ $Key $opts(-in) $opts(-out) $opts(-chunksize) $opts(-pad)] if {[info commands ::tkwait] != {}} { tkwait variable [subst $Key](reading) } else { vwait [subst $Key](reading) } if {[info exists state(err)]} { foreach {code msg} $state(err) break return -code $code $msg } if {$opts(-out) == {}} { set r $state(output) } Final $Key } |
︙ | ︙ | |||
710 711 712 713 714 715 716 | variable e {} foreach e {trf} { if {[LoadAccelerator $e]} break } unset e } | | | 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 | variable e {} foreach e {trf} { if {[LoadAccelerator $e]} break } unset e } package provide blowfish 1.0.5 # ------------------------------------------------------------------------- # # Local Variables: # mode: tcl # indent-tabs-mode: nil # End: |
Changes to modules/blowfish/blowfish.test.
︙ | ︙ | |||
13 14 15 16 17 18 19 | testing { useLocal blowfish.tcl blowfish } # ------------------------------------------------------------------------- # Handle multiple implementation testing | | > > > | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | testing { useLocal blowfish.tcl blowfish } # ------------------------------------------------------------------------- # Handle multiple implementation testing # TODO: Implement the standard procedures for multi-implementation # handling done in other modules. array set preserve [array get ::blowfish::accel] proc implementations {} { variable ::blowfish::accel foreach {a v} [array get accel] {if {$v} {lappend r $a}} lappend r tcl; set r } |
︙ | ︙ | |||
42 43 44 45 46 47 48 49 50 51 52 53 54 55 | # ------------------------------------------------------------------------- # Report versions # if {[::blowfish::LoadAccelerator trf]} { puts "> Trf based" } puts "> pure Tcl" # ------------------------------------------------------------------------- # Now the package specific tests.... # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- | > > > > > > > > > > > > > > > > > > > > > > > > > > | 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | # ------------------------------------------------------------------------- # Report versions # if {[::blowfish::LoadAccelerator trf]} { puts "> Trf based" } puts "> pure Tcl" proc do-imm {data script} { upvar 1 in in msg msg set in $data list [catch { uplevel 1 $script } msg] $msg } proc do-chan {data script} { upvar 1 in in msg msg set p [makeBinaryFile $data IN] set in [open $p r] fconfigure $in -translation binary -encoding binary set r [list [catch { uplevel 1 $script } msg] $msg] close $in file delete $p return $r } # ------------------------------------------------------------------------- # Now the package specific tests.... # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- |
︙ | ︙ | |||
100 101 102 103 104 105 106 | FEDCBA9876543210 FFFFFFFFFFFFFFFF 6B5C5A9C5D9E0A5A } set n 0 foreach impl [implementations] { select_implementation $impl foreach {key plain cipher} $vectors { | > > > | > > > > > > > | > > > | | < > > > | 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | FEDCBA9876543210 FFFFFFFFFFFFFFFF 6B5C5A9C5D9E0A5A } set n 0 foreach impl [implementations] { select_implementation $impl foreach {key plain cipher} $vectors { set plainb [binary format H* $plain] set keyb [binary format H* $key] test blowfish-$impl-2.$n-imm "blowfish ecb test vector $n (impl $impl)" { do-imm $plainb { string toupper \ [::blowfish::Hex \ [::blowfish::blowfish -mode ecb -dir enc \ -key $keyb \ $in]] } } [list 0 $cipher] test blowfish-$impl-2.$n-chan "blowfish ecb test vector $n (impl $impl)" { do-chan $plainb { string toupper \ [::blowfish::Hex \ [::blowfish::blowfish -mode ecb -dir enc \ -key $keyb \ -in $in]] } } [list 0 $cipher] incr n unset plainb keyb } reset_implementation } set vectors { F9AD597C49DB005E F0 E91D21C1D961A6D6 F0E1 |
︙ | ︙ | |||
146 147 148 149 150 151 152 | } set plain [binary format H* FEDCBA9876543210] foreach impl [implementations] { select_implementation $impl set n 0 foreach {cipher key} $vectors { | | > | > > > > > > > > > > > > > | | < > > > > | > > > > > > > > > > > | > > | < < > | > | 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 | } set plain [binary format H* FEDCBA9876543210] foreach impl [implementations] { select_implementation $impl set n 0 foreach {cipher key} $vectors { test blowfish-$impl-4.$n-imm "blowfish ecb test variable length key (impl $impl)" { set keyb [binary format H* $key] do-imm $plain { string toupper \ [::blowfish::Hex \ [::blowfish::blowfish \ -mode ecb \ -dir enc \ -key $keyb \ $in]] } } [list 0 $cipher] test blowfish-$impl-4.$n-chan "blowfish ecb test variable length key (impl $impl)" { do-chan $plain { string toupper \ [::blowfish::Hex \ [::blowfish::blowfish \ -mode ecb \ -dir enc \ -key $keyb \ -in $in]] } } [list 0 $cipher] incr n unset keyb } reset_implementation } set key [binary format H* 0123456789ABCDEFF0E1D2C3B4A59687] set iv [binary format H* FEDCBA9876543210] set plain [binary format H* \ 37363534333231204E6F77206973207468652074696D6520666F722000000000] foreach impl [implementations] { select_implementation $impl test blowfish-$impl-6.1-imm "blowfish cbc mode (impl $impl)" { do-imm $plain { string toupper \ [::blowfish::Hex \ [::blowfish::blowfish \ -dir enc \ -mode cbc \ -iv $iv \ -key $key \ $in]] } } [list 0 6B77B4D63006DEE605B156E27403979358DEB9E7154616D959F1652BD5FF92CC] test blowfish-$impl-6.1-chan "blowfish cbc mode (impl $impl)" { do-chan $plain { string toupper \ [::blowfish::Hex \ [::blowfish::blowfish \ -dir enc \ -mode cbc \ -iv $iv \ -key $key \ -in $in]] } } [list 0 6B77B4D63006DEE605B156E27403979358DEB9E7154616D959F1652BD5FF92CC] reset_implementation } #cfb E73214A2822139CAF26ECF6D2EB9E76E3DA3DE04D1517200519D57A6C3 #ofb E73214A2822139CA62B343CC5B65587310DD908D0C241B2263C2CF80DA foreach impl [implementations] { |
︙ | ︙ | |||
221 222 223 224 225 226 227 | } {0 0} test blowfish-$impl-8.0 {check hyphen in crypt data} { list [catch { set key "uP/AD/oGb6q/" set text "ececho cleardata" set cipher [blowfish::blowfish -mode ecb -key $key -dir encrypt $text] | | | | < < | | > > > | > > | > | > > | < < | | > > | > | > > | < < | | > > > > > > > > | > > > > > < < | | > > > | > > | > | < > > > > | 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 | } {0 0} test blowfish-$impl-8.0 {check hyphen in crypt data} { list [catch { set key "uP/AD/oGb6q/" set text "ececho cleardata" set cipher [blowfish::blowfish -mode ecb -key $key -dir encrypt $text] set plain [blowfish::blowfish -mode ecb -key $key -dir decrypt $cipher] string compare $plain $text } msg] $msg } {0 0} test blowfish-$impl-8.1 {check hyphen in plaintext} { list [catch { set key "uP/AD/oGb6q/" set text "-cecho cleardata" set cipher [blowfish::blowfish -mode ecb -key $key -dir encrypt $text] set plain [blowfish::blowfish -mode ecb -key $key -dir decrypt $cipher] string compare $plain $text } msg] $msg } {0 0} test blowfish-$impl-8.2 {check hyphen in key} { list [catch { set key "-P/AD/oGb6q/" set text "ececho cleardata" set cipher [blowfish::blowfish -mode ecb -key $key -dir encrypt $text] set plain [blowfish::blowfish -mode ecb -key $key -dir decrypt $cipher] string compare $plain $text } msg] $msg } {0 0} test blowfish-$impl-8.3 {check option termination} { list [catch { set key "uP/AD/oGb6q/" set text "ececho cleardata" set cipher [blowfish::blowfish -mode ecb -key $key -dir encrypt -- $text] set plain [blowfish::blowfish -mode ecb -key $key -dir decrypt -- $cipher] string compare $plain $text } msg] $msg } {0 0} set key "uP/AD/oGb6q/" set text "01234" test blowfish-$impl-9.0-imm {check -pad option, as} { do-imm $text { blowfish::blowfish -mode ecb -hex -key $key -dir encrypt -pad a -- $in } } {0 8927243c2d7d568c} test blowfish-$impl-9.0-chan {check -pad option, as} { do-chan $text { blowfish::blowfish -mode ecb -hex -key $key -dir encrypt -pad a -in $in } } {0 8927243c2d7d568c} test blowfish-$impl-9.1-imm {check -pad option, spaces} { do-imm $text { blowfish::blowfish -mode ecb -hex -key $key -dir encrypt -pad { } -- $in } } {0 3fc711286b8eca79} test blowfish-$impl-9.1-chan {check -pad option, spaces} { do-chan $text { blowfish::blowfish -mode ecb -hex -key $key -dir encrypt -pad { } -in $in } } {0 3fc711286b8eca79} test blowfish-$impl-9.2-imm {check -pad option, no padding} { set r [do-imm $text { set cipher [blowfish::blowfish -mode ecb -hex -key $key \ -dir encrypt -pad "" -- $in] }] lreplace $r end end \ [expr { [string equal $msg \ {invalid block size: blocks must be 8 bytes}] \ || [string equal $msg \ {can not encrypt incomplete block at end of input}]}] } {1 1} test blowfish-$impl-9.2-chan {check -pad option, no padding} { set r [do-chan $text { blowfish::blowfish -mode ecb -hex -key $key -dir encrypt -pad "" -in $in }] lreplace $r end end \ [expr { [string equal $msg \ {invalid block size: blocks must be 8 bytes}] \ || [string equal $msg \ {can not encrypt incomplete block at end of input}]}] } {1 1} set key [binary format H* "04B915BA43FEB5B6"] set text [binary format H* "42FD443059577FA2"] test blowfish-$impl-9.3-imm {check -dir option default is encrypt} { do-imm $text { blowfish::blowfish -mode ecb -pad "" -hex -key $key -- $in } } {0 353882b109ce8f1a} test blowfish-$impl-9.3-chan {check -dir option default is encrypt} { do-chan $text { blowfish::blowfish -mode ecb -pad "" -hex -key $key -in $in } } {0 353882b109ce8f1a} unset text key reset_implementation } # ------------------------------------------------------------------------- testsuiteCleanup # Local variables: # mode: tcl # indent-tabs-mode: nil # End: |
Changes to modules/blowfish/pkgIndex.tcl.
1 2 3 4 | if {![package vsatisfies [package provide Tcl] 8.2]} { # PRAGMA: returnok return } | | | 1 2 3 4 5 | if {![package vsatisfies [package provide Tcl] 8.2]} { # PRAGMA: returnok return } package ifneeded blowfish 1.0.5 [list source [file join $dir blowfish.tcl]] |
Changes to modules/clay/build/build.tcl.
1 2 3 | set srcdir [file dirname [file normalize [file join [pwd] [info script]]]] set moddir [file dirname $srcdir] | | | 1 2 3 4 5 6 7 8 9 10 11 | set srcdir [file dirname [file normalize [file join [pwd] [info script]]]] set moddir [file dirname $srcdir] set version 0.8.6 set module clay set filename clay if {[file exists [file join $moddir .. .. scripts practcl.tcl]]} { source [file join $moddir .. .. scripts practcl.tcl] } elseif {[file exists [file join $moddir .. practcl build doctool.tcl]]} { source [file join $moddir .. practcl build doctool.tcl] } else { |
︙ | ︙ |
Changes to modules/clay/build/ensemble.tcl.
1 2 3 4 5 6 | ::namespace eval ::clay::define {} proc ::clay::ensemble_methodbody {ensemble einfo} { set default standard set preamble {} set eswitch {} | > > > > > > > > > > > > > < | < < < | < < < < < < < < < < | < < | | < < < | | < < < < | | | | < | < < | > | < < < < < | | | | < > > | < > | | | | < | | > | > | | | | < > > > | < | < < < < | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | ::namespace eval ::clay::define {} ### # Produce the body of an ensemble's public dispatch method # ensemble is the name of the the ensemble. # einfo is a dictionary of methods for the ensemble, and each value is a script # to execute on dispatch # example: # ::clay::ensemble_methodbody foo { # bar {tailcall my Foo_bar {*}$args} # baz {tailcall my Foo_baz {*}$args} # clock {return [clock seconds]} # default {puts "You gave me $method"} # } ### proc ::clay::ensemble_methodbody {ensemble einfo} { set default standard set preamble {} set eswitch {} set Ensemble [string totitle $ensemble] if {$Ensemble eq "."} continue foreach {msubmethod minfo} [lsort -dictionary -stride 2 $einfo] { if {$msubmethod eq "."} continue if {![dict exists $minfo body:]} { continue } set submethod [string trim $msubmethod :/-] if {$submethod eq "default"} { set default [dict get $minfo body:] } else { dict set eswitch $submethod [dict get $minfo body:] } if {[dict exists $submethod aliases:]} { foreach alias [dict get $minfo aliases:] { if {![dict exists $eswitch $alias]} { dict set eswitch $alias [dict get $minfo body:] } } } } set methodlist [lsort -dictionary [dict keys $eswitch]] if {![dict exists $eswitch <list>]} { dict set eswitch <list> {return $methodlist} } if {$default eq "standard"} { set default "error \"unknown method $ensemble \$method. Valid: \$methodlist\"" } dict set eswitch default $default set mbody {} append mbody \n [list set methodlist $methodlist] append mbody \n "switch -- \$method \{$eswitch\}" \n return $mbody } ::proc ::clay::define::Ensemble {rawmethod args} { if {[llength $args]==2} { lassign $args argspec body set argstyle tcl } elseif {[llength $args]==3} { lassign $args argstyle argspec body } else { error "Usage: Ensemble name ?argstyle? argspec body" } set class [current_class] #if {$::clay::trace>2} { # puts [list $class Ensemble $rawmethod $argspec $body] #} set mlist [split $rawmethod "::"] set ensemble [string trim [lindex $mlist 0] :/] set method [string trim [lindex $mlist 2] :/] if {[string index $method 0] eq "_"} { $class clay set method_ensemble $ensemble $method $body return } set realmethod [string totitle $ensemble]_${method} set realbody {} if {$argstyle eq "dictargs"} { append realbody "::dictargs::parse \{$argspec\} \$args" \n } if {[$class clay exists method_ensemble $ensemble _preamble]} { append realbody [$class clay get method_ensemble $ensemble _preamble] \n } append realbody $body if {$method eq "default"} { $class clay set method_ensemble $ensemble $method: "tailcall my $realmethod \$method {*}\$args" if {$argstyle eq "dictargs"} { oo::define $class method $realmethod [list method [list args $argspec]] $realbody } else { oo::define $class method $realmethod [list method {*}$argspec] $realbody } } else { $class clay set method_ensemble $ensemble $method: "tailcall my $realmethod {*}\$args" if {$argstyle eq "dictargs"} { oo::define $class method $realmethod [list [list args $argspec]] $realbody } else { oo::define $class method $realmethod $argspec $realbody } } if {$::clay::trace>2} { puts [list $class clay set method_ensemble/ $ensemble [string trim $method :/] ...] } } |
Changes to modules/clay/build/object.tcl.
︙ | ︙ | |||
10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # to a combination of its own clay data as # well as to that of its class # ensemble: # ancestors { # argspec {} # description {Return the class this object belongs to, all classes mixed into this object, and all ancestors of those classes in search order.} # } # cget { # argspec {field {mandatory 1 positional 1}} # description { # Pull a value from either the object's clay structure or one of its constituent classes that matches the field name. # The order of search us: # [para] 1. The as a value in local dict variable config # [para] 2. The as a value in local dict variable clay | > > > > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # to a combination of its own clay data as # well as to that of its class # ensemble: # ancestors { # argspec {} # description {Return the class this object belongs to, all classes mixed into this object, and all ancestors of those classes in search order.} # } # cache { # argspec {path {mandatory 1 positional 1} value {mandatory 1 positional 1}} # description {Store VALUE in such a way that request in SEARCH for PATH will always return it until the cache is flushed} # } # cget { # argspec {field {mandatory 1 positional 1}} # description { # Pull a value from either the object's clay structure or one of its constituent classes that matches the field name. # The order of search us: # [para] 1. The as a value in local dict variable config # [para] 2. The as a value in local dict variable clay |
︙ | ︙ | |||
66 67 68 69 70 71 72 73 74 75 76 77 78 79 | # description {With no arguments returns the map of stubs and classes mixed into the current object. When only stub is given, # returns the classes mixed in on that stub. When stub and classlist given, replace the classes currently on that stub with the given # classes and invoke clay mixin on the new matrix of mixed in classes. # } # } # provenance {argspec {path {mandatory 1 positional 1 repeating 1}} description {Return either [const self] if that path exists in the current object, or return the first class (if any) along the clay search path which contains that element.}} # replace {argspec {dictionary {mandatory 1 positional 1}} description {Replace the contents of the internal clay storage with the dictionary given.}} # source {argspec {filename {mandatory 1 positional 1}} description {Source the given filename within the object's namespace}} # set {argspec {path {mandatory 1 positional 1 repeating 1} value {mandatory 1 postional 1}} description {Merge the conents of [const value] with the object's clay storage at [const path].}} ### method clay {submethod args} { my variable clay claycache clayorder config option_canonical if {![info exists clay]} {set clay {}} if {![info exists claycache]} {set claycache {}} | > > > > | 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | # description {With no arguments returns the map of stubs and classes mixed into the current object. When only stub is given, # returns the classes mixed in on that stub. When stub and classlist given, replace the classes currently on that stub with the given # classes and invoke clay mixin on the new matrix of mixed in classes. # } # } # provenance {argspec {path {mandatory 1 positional 1 repeating 1}} description {Return either [const self] if that path exists in the current object, or return the first class (if any) along the clay search path which contains that element.}} # replace {argspec {dictionary {mandatory 1 positional 1}} description {Replace the contents of the internal clay storage with the dictionary given.}} # search { # argspec {path {mandatory 1 positional 1} valuevar {mandatory 1 positional 1} isleafvar {mandatory 1 positional 1}} # description {Return true, and set valuevar to the value and isleafar to true for false if PATH was found in the cache.} #} # source {argspec {filename {mandatory 1 positional 1}} description {Source the given filename within the object's namespace}} # set {argspec {path {mandatory 1 positional 1 repeating 1} value {mandatory 1 postional 1}} description {Merge the conents of [const value] with the object's clay storage at [const path].}} ### method clay {submethod args} { my variable clay claycache clayorder config option_canonical if {![info exists clay]} {set clay {}} if {![info exists claycache]} {set claycache {}} |
︙ | ︙ | |||
96 97 98 99 100 101 102 103 104 105 106 107 108 109 | } branch { set path [::clay::tree::storage $args] if {![dict exists $clay {*}$path .]} { dict set clay {*}$path . {} } } cget { # Leaf searches return one data field at a time # Search in our local dict if {[llength $args]==1} { set field [string trim [lindex $args 0] -:/] if {[info exists option_canonical($field)]} { set field $option_canonical($field) | > > > > > > > > > > > > > > > > | 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | } branch { set path [::clay::tree::storage $args] if {![dict exists $clay {*}$path .]} { dict set clay {*}$path . {} } } busy { my variable clay_busy if {[llength $args]} { set clay_busy [string is true [lindex $args 0]] set claycache {} } if {![info exists clay_busy]} { set clay_busy 0 } return $clay_busy } cache { set path [lindex $args 0] set value [lindex $args 1] dict set claycache $path $value } cget { # Leaf searches return one data field at a time # Search in our local dict if {[llength $args]==1} { set field [string trim [lindex $args 0] -:/] if {[info exists option_canonical($field)]} { set field $option_canonical($field) |
︙ | ︙ | |||
179 180 181 182 183 184 185 | foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return $result } ensemble_map { | | < < | | | > > > > > > > > > > > > > > > > > > > > | | | 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 | foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return $result } ensemble_map { set path [::clay::tree::storage method_ensemble] if {[dict exists $claycache {*}$path]} { return [dict get $claycache {*}$path] } set emap {} foreach class $clayorder { if {![$class clay exists {*}$path .]} continue dict for {ensemble einfo} [$class clay dget {*}$path] { if {$ensemble eq "."} continue dict for {method body} $einfo { if {$method eq "."} continue dict set emap $ensemble $method class: $class dict set emap $ensemble $method body: $body } } } if {[dict exists $clay {*}$path]} { dict for {ensemble einfo} [dict get $clay {*}$path] { dict for {method body} $einfo { if {$method eq "."} continue dict set emap $ensemble $method class: $class dict set emap $ensemble $method body: $body } } } dict set claycache {*}$path $emap return $emap } eval { set script [lindex $args 0] set buffer {} set thisline {} foreach line [split $script \n] { append thisline $line |
︙ | ︙ | |||
259 260 261 262 263 264 265 | # Search in the in our list of classes for an answer foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return $result } | < < < < < < < > > > > > | | < < < < < < < > > > > > > > > | | | > | > > | < < | > | 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 | # Search in the in our list of classes for an answer foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return $result } if {[dict exists $clay {*}$path] && ![dict exists $clay {*}$path .]} { # Path is a leaf return [dict get $clay {*}$path] } # Search in our local cache if {[my clay search $path value isleaf]} { return $value } set found 0 set branch [dict exists $clay {*}$path .] foreach class $clayorder { if {[$class clay exists {*}$path .]} { set found 1 break } if {!$branch && [$class clay exists {*}$path]} { set result [$class clay dget {*}$path] my clay cache $path $result return $result } } # Path is a branch set result [dict getnull $clay {*}$path] foreach class $clayorder { if {![$class clay exists {*}$path .]} continue ::clay::tree::dictmerge result [$class clay dget {*}$path] } #if {[dict exists $clay {*}$path .]} { # ::clay::tree::dictmerge result #} my clay cache $path $result return $result } getnull - get { set path [::clay::tree::storage $args] if {[llength $path]==0} { # Do a full dump of clay data set result {} # Search in the in our list of classes for an answer foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return [::clay::tree::sanitize $result] } if {[dict exists $clay {*}$path] && ![dict exists $clay {*}$path .]} { # Path is a leaf return [dict get $clay {*}$path] } # Search in our local cache if {[my clay search $path value isleaf]} { if {!$isleaf} { return [clay::tree::sanitize $value] } else { return $value } } set found 0 set branch [dict exists $clay {*}$path .] foreach class $clayorder { if {[$class clay exists {*}$path .]} { set found 1 break } if {!$branch && [$class clay exists {*}$path]} { set result [$class clay dget {*}$path] my clay cache $path $result return $result } } # Path is a branch set result [dict getnull $clay {*}$path] #foreach class [lreverse $clayorder] { # if {![$class clay exists {*}$path .]} continue # ::clay::tree::dictmerge result [$class clay dget {*}$path] #} foreach class $clayorder { if {![$class clay exists {*}$path .]} continue ::clay::tree::dictmerge result [$class clay dget {*}$path] } #if {[dict exists $clay {*}$path .]} { # ::clay::tree::dictmerge result [dict get $clay {*}$path] #} my clay cache $path $result return [clay::tree::sanitize $result] } leaf { # Leaf searches return one data field at a time # Search in our local dict set path [::clay::tree::storage $args] if {[dict exists $clay {*}$path .]} { return [clay::tree::sanitize [dict get $clay {*}$path]] } if {[dict exists $clay {*}$path]} { return [dict get $clay {*}$path] } # Search in our local cache if {[my clay search $path value isleaf]} { if {!$isleaf} { return [clay::tree::sanitize $value] } else { return $value } } # Search in the in our list of classes for an answer foreach class $clayorder { if {[$class clay exists {*}$path]} { set value [$class clay get {*}$path] my clay cache $path $value return $value } } } merge { foreach arg $args { ::clay::tree::dictmerge clay {*}$arg } } mixin { ### # Mix in the class ### my clay flush set prior [info object mixins [self]] set newmixin {} foreach item $args { lappend newmixin ::[string trimleft $item :] } set newmap $args foreach class $prior { |
︙ | ︙ | |||
426 427 428 429 430 431 432 | puts stderr "[self] MIXIN ERROR PEEKING $class:\n[dict get $errdat -errorinfo]" } break } } } mixinmap { | < | 469 470 471 472 473 474 475 476 477 478 479 480 481 482 | puts stderr "[self] MIXIN ERROR PEEKING $class:\n[dict get $errdat -errorinfo]" } break } } } mixinmap { if {![dict exists $clay .mixin]} { dict set clay .mixin {} } if {[llength $args]==0} { return [dict get $clay .mixin] } elseif {[llength $args]==1} { return [dict getnull $clay .mixin [lindex $args 0]] |
︙ | ︙ | |||
479 480 481 482 483 484 485 486 487 488 489 490 | if {$refcount <= 0} { ::clay::object_destroy [self] } } replace { set clay [lindex $args 0] } source { source [lindex $args 0] } set { #puts [list [self] clay SET {*}$args] | > > > > > > > > > > < | > > > > > | 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 | if {$refcount <= 0} { ::clay::object_destroy [self] } } replace { set clay [lindex $args 0] } search { set path [lindex $args 0] upvar 1 [lindex $args 1] value [lindex $args 2] isleaf set isleaf [expr {![dict exists $claycache $path .]}] if {[dict exists $claycache $path]} { set value [dict get $claycache $path] return 1 } return 0 } source { source [lindex $args 0] } set { #puts [list [self] clay SET {*}$args] ::clay::tree::dictset clay {*}$args } default { dict $submethod clay {*}$args } } } ### # Instantiate variables. Called on object creation and during clay mixin. ### method InitializePublic {} { my variable clayorder clay claycache config option_canonical clay_busy if {[info exists clay_busy] && $clay_busy} { # Avoid repeated calls to InitializePublic if we know that someone is # going to invoke it at the end of whatever process is going on return } set claycache {} set clayorder [::clay::ancestors [info object class [self]] {*}[lreverse [info object mixins [self]]]] if {![info exists clay]} { set clay {} } if {![info exists config]} { set config {} |
︙ | ︙ | |||
563 564 565 566 567 568 569 | } dict set config $field $value set setcmd [dict getnull $info set-command] if {$setcmd ne {}} { {*}[string map [list %field% [list $field] %value% [list $value] %self% [namespace which my]] $setcmd] } } | < < < < < | < < < < < < < < < < < < < < < < < < < < < < | > | 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 | } dict set config $field $value set setcmd [dict getnull $info set-command] if {$setcmd ne {}} { {*}[string map [list %field% [list $field] %value% [list $value] %self% [namespace which my]] $setcmd] } } foreach {ensemble einfo} [my clay ensemble_map] { #if {[dict exists $einfo _body]} continue if {$ensemble eq "."} continue set body [::clay::ensemble_methodbody $ensemble $einfo] if {$::clay::trace>2} { set rawbody $body set body {puts [list [self] <object> [self method]]} append body \n $rawbody } oo::objdefine [self] method $ensemble {{method default} args} $body |
︙ | ︙ |
Changes to modules/clay/build/procs.tcl.
1 2 3 4 5 6 7 8 9 | namespace eval ::clay {} set ::clay::trace 0 ### # Because many features in this package may be added as # commands to future tcl cores, or be provided in binary # form by packages, I need a declaritive way of saying # [emph {Create this command if there isn't one already}]. # The [emph ninja] argument is a script to execute if the | > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | namespace eval ::clay {} set ::clay::trace 0 if {[info commands ::cron::object_destroy] eq {}} { # Provide a noop if we aren't running with the cron scheduler namespace eval ::cron {} proc ::cron::object_destroy args {} } ### # Because many features in this package may be added as # commands to future tcl cores, or be provided in binary # form by packages, I need a declaritive way of saying # [emph {Create this command if there isn't one already}]. # The [emph ninja] argument is a script to execute if the |
︙ | ︙ | |||
197 198 199 200 201 202 203 204 205 206 207 208 209 210 | # a handy default for method delegation if a delegate has not been # assigned yet. proc ::clay::noop args {} if {[info commands ::noop] eq {}} { namespace eval ::clay { namespace export noop } namespace eval :: { namespace import ::clay::noop } } proc ::clay::path args { set result {} foreach item $args { set item [string trim $item :./] foreach subitem [split $item /] { lappend result [string trim ${subitem}]/ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 | # a handy default for method delegation if a delegate has not been # assigned yet. proc ::clay::noop args {} if {[info commands ::noop] eq {}} { namespace eval ::clay { namespace export noop } namespace eval :: { namespace import ::clay::noop } } ### # Process the queue of objects to be destroyed ### proc ::clay::cleanup {} { set count 0 if {![info exists ::clay::idle_destroy]} return set objlist $::clay::idle_destroy set ::clay::idle_destroy {} foreach obj $objlist { if {![catch {$obj destroy}]} { incr count } } return $count } proc ::clay::object_create {objname {class {}}} { #if {$::clay::trace>0} { # puts [list $objname CREATE] #} } proc ::clay::object_rename {object newname} { if {$::clay::trace>0} { puts [list $object RENAME -> $newname] } } ### # Mark an objects for destruction on the next cleanup ### proc ::clay::object_destroy args { if {![info exists ::clay::idle_destroy]} { set ::clay::idle_destroy {} } foreach objname $args { if {$::clay::trace>0} { puts [list $objname DESTROY] } ::cron::object_destroy $objname if {$objname in $::clay::idle_destroy} continue lappend ::clay::idle_destroy $objname } } proc ::clay::path args { set result {} foreach item $args { set item [string trim $item :./] foreach subitem [split $item /] { lappend result [string trim ${subitem}]/ |
︙ | ︙ |
Added modules/clay/build/singleton.tcl.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | ### # An object which is intended to be it's own class. # arglist: # name {mandatory 1 positional 1 description {the fully qualified name of the object}} # script {mandatory 1 positional 1 description { # A script that will be executed in the object's namespace. # The command [bold clay] is provided, and will allow the script to exercise the object's own # clay method. The command [bold method] is provided, and will define or modify a per-instance # version of the object's method. The command [bold Ensemble] is provided, and will define or # modify an ensemble method (though customized for this object) # }} ### proc ::clay::singleton {name script} { if {[info commands $name] eq {}} { ::clay::object create $name } oo::objdefine $name { method SingletonProcs {} { proc class class { uplevel 1 "oo::objdefine \[self\] class $class" my clay delegate class $class } proc clay args { my clay {*}$args } proc Ensemble {rawmethod args} { if {[llength $args]==2} { lassign $args argspec body set argstyle tcl } elseif {[llength $args]==3} { lassign $args argstyle argspec body } else { error "Usage: Ensemble name ?argstyle? argspec body" } set class [uplevel 1 self] #if {$::clay::trace>2} { # puts [list $class Ensemble $rawmethod $argspec $body] #} set mlist [split $rawmethod "::"] set ensemble [string trim [lindex $mlist 0] :/] set method [string trim [lindex $mlist 2] :/] if {[string index $method 0] eq "_"} { $class clay set method_ensemble $ensemble $method $body return } set realmethod [string totitle $ensemble]_${method} set realbody {} if {$argstyle eq "dictargs"} { append realbody "::dictargs::parse \{$argspec\} \$args" \n } if {[$class clay exists method_ensemble $ensemble _preamble]} { append realbody [$class clay get method_ensemble $ensemble _preamble] \n } append realbody $body if {$method eq "default"} { $class clay set method_ensemble $ensemble $method: "tailcall my $realmethod \$method {*}\$args" if {$argstyle eq "dictargs"} { oo::objdefine $class method $realmethod [list method [list args $argspec]] $realbody } else { oo::objdefine $class method $realmethod [list method {*}$argspec] $realbody } } else { $class clay set method_ensemble $ensemble $method: "tailcall my $realmethod {*}\$args" if {$argstyle eq "dictargs"} { oo::objdefine $class method $realmethod [list [list args $argspec]] $realbody } else { oo::objdefine $class method $realmethod $argspec $realbody } } if {$::clay::trace>2} { puts [list $class clay set method_ensemble/ $ensemble [string trim $method :/] ...] } } proc method args { uplevel 1 "oo::objdefine \[self\] method {*}$args" } } method script script { my clay busy 1 my SingletonProcs eval $script my clay busy 0 my InitializePublic } } $name script $script return $name } |
Changes to modules/clay/build/test.tcl.
︙ | ︙ | |||
717 718 719 720 721 722 723 724 725 726 727 728 729 730 | clay set const/flavor strawberry clay set {const/ sound} zoink clay set info/ { animal no building no subelement {pedantic yes} } } set claydict-a { const/ {color blue flavor strawberry sound zoink} info/ { animal no building no subelement {pedantic yes} | > > > > > > > > > > > > | 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 | clay set const/flavor strawberry clay set {const/ sound} zoink clay set info/ { animal no building no subelement {pedantic yes} } # Provide a method that returns a constant so we can compare clay's inheritance to # TclOO method color {} { return blue } method flavor {} { return strawberry } method sound {} { return zoink } } set claydict-a { const/ {color blue flavor strawberry sound zoink} info/ { animal no building no subelement {pedantic yes} |
︙ | ︙ | |||
766 767 768 769 770 771 772 773 774 775 776 777 778 779 | const/ {color black flavor vanilla feeling dread} info/ {subelement {spoon yes}} } set commands-b {} foreach {top children} ${claydict-b} { foreach {child value} $children { putb commands-b " [list clay set $top $child $value]" } } putb result [list %class% ${class-b} %commands% ${commands-b}] { clay::define %class% { %commands% } } | > | 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 | const/ {color black flavor vanilla feeling dread} info/ {subelement {spoon yes}} } set commands-b {} foreach {top children} ${claydict-b} { foreach {child value} $children { putb commands-b " [list clay set $top $child $value]" putb commands-b " [list method $child {} [list return $value]]" } } putb result [list %class% ${class-b} %commands% ${commands-b}] { clay::define %class% { %commands% } } |
︙ | ︙ | |||
816 817 818 819 820 821 822 823 824 825 826 827 828 829 | } ### # Tests for objects ### putb result {# ------------------------------------------------------------------------- # OBJECT of ::foo::classa set OBJECTA [::foo::classa new] ### # Test object degation ### proc ::foo::fakeobject {a b} { | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 | } ### # Tests for objects ### putb result {# ------------------------------------------------------------------------- # Singleton ::clay::define ::test::singletonbehavior { method bar {} { return CLASS } method booze {} { return CLASS } Ensemble foo::bang {} { return CLASS } Ensemble foo::both {} { return CLASS } Ensemble foo::mixin {} { return CLASS } Ensemble foo::sloppy {} { return CLASS } } ::clay::define ::test::flavor.strawberry { clay define property flavor strawbery method bar {} { return STRAWBERRY } Ensemble foo::bing {} { return STRAWBERRY } Ensemble foo::both {} { return STRAWBERRY } Ensemble foo::mixin {} { return STRAWBERRY } Ensemble foo::sloppy {} { return STRAWBERRY } } ::clay::singleton ::TEST { class ::test::singletonbehavior clay mixinmap flavor ::test::flavor.strawberry clay set property color green method bar {} { return OBJECT } method booze {} { return OBJECT } method baz {} { return OBJECT } Ensemble foo::bar {} { return OBJECT } Ensemble foo::both {} { return OBJECT } } test oo-object-singleton-001 {Test singleton superclass keyword} { ::TEST clay delegate class } {::test::singletonbehavior} test oo-object-singleton-002 {Test singleton ensemble 1} { ::TEST foo <list> } {bang bar bing both mixin sloppy} test oo-object-singleton-003 {Test singleton ensemble from script} { ::TEST foo bar } {OBJECT} test oo-object-singleton-004 {Test singleton ensemble from mixin} { ::TEST foo bing } {STRAWBERRY} test oo-object-singleton-005 {Test singleton ensemble from class} { ::TEST foo bang } {CLASS} # Test note: the behavior from TclOO is unexpected # Intuitively, a local method should override a mixin # but this is not the case test oo-object-singleton-006 {Test singleton ensemble from conflict, should resolve to object} { ::TEST foo both } {STRAWBERRY} test oo-object-singleton-007 {Test singleton ensemble from conflict, should resolve to mixin} { ::TEST foo sloppy } {STRAWBERRY} ### # Test note: # This should work but does not ### #test oo-object-singleton-009 {Test property from mixin/class} { # ::TEST clay get property flavor #} {strawberry} test oo-object-singleton-008 {Test property from script} { ::TEST clay get property color } {green} # Test note: the behavior from TclOO is unexpected # Intuitively, a local method should override a mixin # but this is not the case test oo-object-singleton-010 {Test method declared in script} { ::TEST bar } {STRAWBERRY} test oo-object-singleton-011 {Test method declared in script} { ::TEST booze } {OBJECT} TEST destroy # OBJECT of ::foo::classa set OBJECTA [::foo::classa new] ### # Test object degation ### proc ::foo::fakeobject {a b} { |
︙ | ︙ | |||
879 880 881 882 883 884 885 886 887 888 889 890 891 892 | test oo-object-clay-method-native-%testnum% {Test native object gets the property %top%/%child%} { $%object1% clay get %top% %child% } {%value%} test oo-object-clay-method-mixin-%testnum% {Test mixin object gets the property %top%/%child%} { $%object2% clay get %top% %child% } {%value%} } } } putb result {# ------------------------------------------------------------------------- # OBJECT of ::foo::classb set OBJECTB [::foo::classb new] # Object with ::foo::classb mixed in | > > > > > > > > > > | 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 | test oo-object-clay-method-native-%testnum% {Test native object gets the property %top%/%child%} { $%object1% clay get %top% %child% } {%value%} test oo-object-clay-method-mixin-%testnum% {Test mixin object gets the property %top%/%child%} { $%object2% clay get %top% %child% } {%value%} } if {$top eq "const/"} { putb result $map { test oo-object-clay-method-native-methodcheck-%testnum% {Test that %top%/%child% would mimic method interheritance for a native class} { $%object1% %child% } {%value%} test oo-object-clay-method-mixin-%testnum% {Test that %top%/%child% would mimic method interheritance for a mixed in class} { $%object2% %child% } {%value%} } } } } putb result {# ------------------------------------------------------------------------- # OBJECT of ::foo::classb set OBJECTB [::foo::classb new] # Object with ::foo::classb mixed in |
︙ | ︙ | |||
909 910 911 912 913 914 915 916 917 918 919 920 921 922 | test oo-object-clay-method-native-%testnum% {Test native object gets the property %top%/%child%} { $%object1% clay get %top% %child% } {%value%} test oo-object-clay-method-mixin-%testnum% {Test mixin object gets the property %top%/%child%} { $%object2% clay get %top% %child% } {%value%} } } } putb result {# ------------------------------------------------------------------------- # OBJECT descended from ::foo::classa ::foo::classb set OBJECTAB [::foo::class.ab new] # Object where classes were mixed in ::foo::classa ::foo::classb | > > > > > > > > > > | 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 | test oo-object-clay-method-native-%testnum% {Test native object gets the property %top%/%child%} { $%object1% clay get %top% %child% } {%value%} test oo-object-clay-method-mixin-%testnum% {Test mixin object gets the property %top%/%child%} { $%object2% clay get %top% %child% } {%value%} } if {$top eq "const/"} { putb result $map { test oo-object-clay-method-native-methodcheck-%testnum% {Test that %top%/%child% would mimic method interheritance for a native class} { $%object1% %child% } {%value%} test oo-object-clay-method-mixin-%testnum% {Test that %top%/%child% would mimic method interheritance for a mixed in class} { $%object2% %child% } {%value%} } } } } putb result {# ------------------------------------------------------------------------- # OBJECT descended from ::foo::classa ::foo::classb set OBJECTAB [::foo::class.ab new] # Object where classes were mixed in ::foo::classa ::foo::classb |
︙ | ︙ | |||
947 948 949 950 951 952 953 954 955 956 957 958 959 960 | test oo-object-clay-method-native-%testnum% {Test native object gets the property %top%/%child%} { $%object1% clay get %top% %child% } {%value%} test oo-object-clay-method-mixin-%testnum% {Test mixin object gets the property %top%/%child%} { $%object2% clay get %top% %child% } {%value%} } } } putb result {# ------------------------------------------------------------------------- # OBJECT descended from ::foo::classb ::foo::classa set OBJECTBA [::foo::class.ba new] # Object where classes were mixed in ::foo::classb ::foo::classa | > > > > > > > > > > | 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 | test oo-object-clay-method-native-%testnum% {Test native object gets the property %top%/%child%} { $%object1% clay get %top% %child% } {%value%} test oo-object-clay-method-mixin-%testnum% {Test mixin object gets the property %top%/%child%} { $%object2% clay get %top% %child% } {%value%} } if {$top eq "const/"} { putb result $map { test oo-object-clay-method-native-methodcheck-%testnum% {Test that %top%/%child% would mimic method interheritance for a native class} { $%object1% %child% } {%value%} test oo-object-clay-method-mixin-%testnum% {Test that %top%/%child% would mimic method interheritance for a mixed in class} { $%object2% %child% } {%value%} } } } } putb result {# ------------------------------------------------------------------------- # OBJECT descended from ::foo::classb ::foo::classa set OBJECTBA [::foo::class.ba new] # Object where classes were mixed in ::foo::classb ::foo::classa |
︙ | ︙ | |||
985 986 987 988 989 990 991 992 993 994 995 996 997 998 | test oo-object-clay-method-native-%testnum% {Test native object gets the property} { $%object1% clay get %top% %child% } {%value%} test oo-object-clay-method-mixin-%testnum% {Test mixin object gets the property} { $%object2% clay get %top% %child% } {%value%} } } } putb resut { ### # Test local setting if clay data in an object ### | > > > > > > > > > > > | 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 | test oo-object-clay-method-native-%testnum% {Test native object gets the property} { $%object1% clay get %top% %child% } {%value%} test oo-object-clay-method-mixin-%testnum% {Test mixin object gets the property} { $%object2% clay get %top% %child% } {%value%} } if {$top eq "const/"} { putb result $map { test oo-object-clay-method-native-methodcheck-%testnum% {Test that %top%/%child% would mimic method interheritance for a native class} { $%object1% %child% } {%value%} test oo-object-clay-method-mixin-%testnum% {Test that %top%/%child% would mimic method interheritance for a mixed in class} { $%object2% %child% } {%value%} } } } } putb resut { ### # Test local setting if clay data in an object ### |
︙ | ︙ | |||
1101 1102 1103 1104 1105 1106 1107 | method do args { return "I did $args" } Ensemble which::color {} { return [my clay get color] } | | | 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 | method do args { return "I did $args" } Ensemble which::color {} { return [my clay get color] } clay set method_ensemble which farbe: {tailcall my Which_color {*}$args} } ### # Test clay information is passed town to subclasses ### test clay-class-clay-0003 {Test that a clay statement is recorded in the object of the class} { ::TEST::myclasse clay get color |
︙ | ︙ | |||
1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 | $OBJ3 which color } black # Test setting properties test clay-object-method-0004 {Test an ensemble alias} { $OBJ3 which farbe } black ### # Test that if you try to replace a global command you get an error ### test clay-nspace-0001 {Test that if you try to replace a global command you get an error} -body { ::clay::define open { method bar {} { return foo } | > > > > > > > > > > > > > > > > > > > > > > | 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 | $OBJ3 which color } black # Test setting properties test clay-object-method-0004 {Test an ensemble alias} { $OBJ3 which farbe } black ### # Added 2019-06-24 # Test that grabbing a leaf does not pollute the cache ### ::clay::define ::TEST::class_with_deep_tree { clay set tree deep has depth 1 clay set tree shallow has depth 0 } $OBJ3 clay mixinmap deep ::TEST::class_with_deep_tree test clay-deep-nested-0001 {Test that a leaf query does not pollute the cache} { $OBJ3 clay get tree shallow has depth } 0 test clay-deep-nested-0001 {Test that a leaf query does not pollute the cache} { $OBJ3 clay get tree } {deep {has {depth 1}} shallow {has {depth 0}}} ### # Test that if you try to replace a global command you get an error ### test clay-nspace-0001 {Test that if you try to replace a global command you get an error} -body { ::clay::define open { method bar {} { return foo } |
︙ | ︙ | |||
1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 | } {::cluster::fubar} test clay-nspace-0003 {Test a fully qualified class ends up in the proper namespace} { info commands ::clay::pot } {::clay::pot} #set ::clay::trace 3 ### # Mixin tests ### ### # Define a core class ### | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 | } {::cluster::fubar} test clay-nspace-0003 {Test a fully qualified class ends up in the proper namespace} { info commands ::clay::pot } {::clay::pot} #set ::clay::trace 3 ### # New test - Added 2019-09-15 # Test that the "method" variable is exposed to a default method ### ::clay::define ::ensembleWithDefault { Ensemble foo::bar {} { return A } Ensemble foo::baz {} { return B } Ensemble foo::bang {} { return C } Ensemble foo::default {} { return $method } } set OBJ [::ensembleWithDefault new] test clay-ensemble-default-0001 {Test a normal ensemble method} { $OBJ foo bar } {A} test clay-ensemble-default-0002 {Test a normal ensemble method} { $OBJ foo baz } {B} test clay-ensemble-default-0003 {Test a normal ensemble method} { $OBJ foo <list> } [lsort -dictionary {bar baz bang}] test clay-ensemble-default-0004 {Test a normal ensemble method} { $OBJ foo bing } {bing} test clay-ensemble-default-0005 {Test a normal ensemble method} { $OBJ foo bong } {bong} ### # Mixin tests ### ### # Define a core class ### |
︙ | ︙ | |||
1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 | Ensemble which::flavor {} { return [my clay get flavor] } Ensemble which::color {} { return [my clay get color] } } ::clay::define ::TEST::animal { clay color unknown clay sound unknown Ensemble which::sound {} { return [my clay get sound] } Ensemble which::color {} { return [my clay get color] } } ::clay::define ::TEST::species.cat { superclass ::TEST::animal clay sound meow | > > > > > > | > > > | 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 | Ensemble which::flavor {} { return [my clay get flavor] } Ensemble which::color {} { return [my clay get color] } } ::clay::define ::TEST::animal { clay color unknown clay sound unknown Ensemble which::sound {} { return [my clay get sound] } Ensemble which::color {} { return [my clay get color] } method sound {} { return unknown } } ::clay::define ::TEST::species.cat { superclass ::TEST::animal clay sound meow method sound {} { return meow } } ::clay::define ::TEST::coloring.calico { clay color calico } ::clay::define ::TEST::condition.dark { Ensemble which::color {} { return grey } } ::clay::define ::TEST::mood.happy { Ensemble which::sound {} { return purr } method sound {} { return purr } } test clay-object-0001 {Test than an object is created when clay::define is invoked} { info commands ::TEST::mood.happy } ::TEST::mood.happy set OBJ [::TEST::thing new] |
︙ | ︙ | |||
1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 | test clay-mixin-b-0001 {Test that an ensemble is created during a mixin} { $OBJ which color } {unknown} test clay-mixin-b-0002 {Test that an ensemble is created during a mixin} { $OBJ which sound } {unknown} test clay-mixin-b-0003 {Test that an ensemble is created during a mixin} \ -body {$OBJ which flavor} -returnCodes {error} \ -result {unknown method which flavor. Valid: color sound} ### # Test Modified: 2018-10-21 ### test clay-mixin-b-0004 {Test that mixins resolve in the correct order} { $OBJ clay ancestors } {::TEST::animal ::TEST::thing ::clay::object} | > > | 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 | test clay-mixin-b-0001 {Test that an ensemble is created during a mixin} { $OBJ which color } {unknown} test clay-mixin-b-0002 {Test that an ensemble is created during a mixin} { $OBJ which sound } {unknown} test clay-mixin-b-0003 {Test that an ensemble is created during a mixin} \ -body {$OBJ which flavor} -returnCodes {error} \ -result {unknown method which flavor. Valid: color sound} ### # Test Modified: 2018-10-21 ### test clay-mixin-b-0004 {Test that mixins resolve in the correct order} { $OBJ clay ancestors } {::TEST::animal ::TEST::thing ::clay::object} |
︙ | ︙ | |||
1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 | ### # Replacing a mixin $OBJ clay mixinmap species ::TEST::species.cat test clay-mixin-e-0001 {Test that an ensemble is created during a mixin} { $OBJ which color } {unknown} test clay-mixin-e-0002 {Test that an ensemble is created during a mixin} { $OBJ which sound } {meow} test clay-mixin-e-0003 {Test that an ensemble is created during a mixin} \ -body {$OBJ which flavor} -returnCodes {error} \ -result {unknown method which flavor. Valid: color sound} ### | > > > > > > | 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 | ### # Replacing a mixin $OBJ clay mixinmap species ::TEST::species.cat test clay-mixin-e-0001 {Test that an ensemble is created during a mixin} { $OBJ which color } {unknown} test clay-mixin-e-0002a {Test that an ensemble is created during a mixin} { $OBJ sound } {meow} test clay-mixin-e-0002b {Test that an ensemble is created during a mixin} { $OBJ clay get sound } {meow} test clay-mixin-e-0002 {Test that an ensemble is created during a mixin} { $OBJ which sound } {meow} test clay-mixin-e-0003 {Test that an ensemble is created during a mixin} \ -body {$OBJ which flavor} -returnCodes {error} \ -result {unknown method which flavor. Valid: color sound} ### |
︙ | ︙ |
Changes to modules/clay/clay.man.
1 | [comment {-*- tcl -*- doctools manpage}] | | | 1 2 3 4 5 6 7 8 9 | [comment {-*- tcl -*- doctools manpage}] [vset PACKAGE_VERSION 0.8.6] [manpage_begin clay n [vset PACKAGE_VERSION]] [keywords oo] [copyright {2018 Sean Woods <[email protected]>}] [moddesc {Clay Framework}] [titledesc {A minimalist framework for large scale OO Projects}] [category {Programming tools}] [keywords TclOO] |
︙ | ︙ | |||
169 170 171 172 173 174 175 176 177 178 179 180 181 182 | [call proc [cmd clay::noop] [opt "[arg args]"]] Perform a noop. Useful in prototyping for commenting out blocks of code without actually having to comment them out. It also makes a handy default for method delegation if a delegate has not been assigned yet. [call proc [cmd clay::path] [opt "[arg args]"]] [call proc [cmd clay::putb] [opt "[arg map]"] [arg text]] | > > > > > > > > > > > > > > > > > > > > | 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | [call proc [cmd clay::noop] [opt "[arg args]"]] Perform a noop. Useful in prototyping for commenting out blocks of code without actually having to comment them out. It also makes a handy default for method delegation if a delegate has not been assigned yet. [call proc [cmd clay::cleanup]] Process the queue of objects to be destroyed [call proc [cmd clay::object_create] [arg objname] [opt "[arg class] [const ""]"]] [call proc [cmd clay::object_rename] [arg object] [arg newname]] [call proc [cmd clay::object_destroy] [opt "[arg args]"]] Mark an objects for destruction on the next cleanup [call proc [cmd clay::path] [opt "[arg args]"]] [call proc [cmd clay::putb] [opt "[arg map]"] [arg text]] |
︙ | ︙ | |||
446 447 448 449 450 451 452 | (if missing) when the object changes class via the [emph morph] method. [call proc [cmd clay::ensemble_methodbody] [arg ensemble] [arg einfo]] | | | | | < < | | | | < | | < < | < | | 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 | (if missing) when the object changes class via the [emph morph] method. [call proc [cmd clay::ensemble_methodbody] [arg ensemble] [arg einfo]] Produce the body of an ensemble's public dispatch method ensemble is the name of the the ensemble. einfo is a dictionary of methods for the ensemble, and each value is a script to execute on dispatch [para]Example: [example { ::clay::ensemble_methodbody foo { bar {tailcall my Foo_bar {*}$args} baz {tailcall my Foo_baz {*}$args} clock {return [clock seconds]} default {puts "You gave me $method"} } }] [call proc [cmd clay::define::Ensemble] [arg rawmethod] [opt "[arg args]"]] [call proc [cmd clay::event::cancel] [arg self] [opt "[arg task] [const "*"]"]] Cancel a scheduled event |
︙ | ︙ | |||
533 534 535 536 537 538 539 540 541 542 543 544 545 546 | [call proc [cmd clay::event::unsubscribe] [arg self] [opt "[arg args]"]] Unsubscribe an object from an event pattern [list_end] [section Classes] [subsection {Class clay::class}] [para] | > > > > > | 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 | [call proc [cmd clay::event::unsubscribe] [arg self] [opt "[arg args]"]] Unsubscribe an object from an event pattern [call proc [cmd clay::singleton] [arg name] [arg script]] An object which is intended to be it's own class. [list_end] [section Classes] [subsection {Class clay::class}] [para] |
︙ | ︙ | |||
599 600 601 602 603 604 605 606 607 608 609 610 611 612 | [para] [class {Methods}] [list_begin definitions] [call method [cmd "clay ancestors"]] Return the class this object belongs to, all classes mixed into this object, and all ancestors of those classes in search order. [call method [cmd "clay cget"] [arg field]] Pull a value from either the object's clay structure or one of its constituent classes that matches the field name. The order of search us: [para] 1. The as a value in local dict variable config [para] 2. The as a value in local dict variable clay [para] 3. As a leaf in any ancestor as a root of the clay tree | > > > | 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 | [para] [class {Methods}] [list_begin definitions] [call method [cmd "clay ancestors"]] Return the class this object belongs to, all classes mixed into this object, and all ancestors of those classes in search order. [call method [cmd "clay cache"] [arg path] [arg value]] Store VALUE in such a way that request in SEARCH for PATH will always return it until the cache is flushed [call method [cmd "clay cget"] [arg field]] Pull a value from either the object's clay structure or one of its constituent classes that matches the field name. The order of search us: [para] 1. The as a value in local dict variable config [para] 2. The as a value in local dict variable clay [para] 3. As a leaf in any ancestor as a root of the clay tree |
︙ | ︙ | |||
675 676 677 678 679 680 681 682 683 684 685 686 687 688 | [call method [cmd "clay provenance"] [arg path] [opt [option "path..."]]] Return either [const self] if that path exists in the current object, or return the first class (if any) along the clay search path which contains that element. [call method [cmd "clay replace"] [arg dictionary]] Replace the contents of the internal clay storage with the dictionary given. [call method [cmd "clay source"] [arg filename]] Source the given filename within the object's namespace [call method [cmd "clay set"] [arg path] [opt [option "path..."]] [arg value]] Merge the conents of [const value] with the object's clay storage at [const path]. [call method [cmd "InitializePublic"]] | > > > | 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 | [call method [cmd "clay provenance"] [arg path] [opt [option "path..."]]] Return either [const self] if that path exists in the current object, or return the first class (if any) along the clay search path which contains that element. [call method [cmd "clay replace"] [arg dictionary]] Replace the contents of the internal clay storage with the dictionary given. [call method [cmd "clay search"] [arg path] [arg valuevar] [arg isleafvar]] Return true, and set valuevar to the value and isleafar to true for false if PATH was found in the cache. [call method [cmd "clay source"] [arg filename]] Source the given filename within the object's namespace [call method [cmd "clay set"] [arg path] [opt [option "path..."]] [arg value]] Merge the conents of [const value] with the object's clay storage at [const path]. [call method [cmd "InitializePublic"]] |
︙ | ︙ |
Changes to modules/clay/clay.tcl.
1 2 3 4 5 6 7 8 | ### # clay.tcl # # Copyright (c) 2018 Sean Woods # # BSD License ### # @@ Meta Begin | | | > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | ### # clay.tcl # # Copyright (c) 2018 Sean Woods # # BSD License ### # @@ Meta Begin # Package clay 0.8.6 # Meta platform tcl # Meta summary A minimalist framework for complex TclOO development # Meta description This package introduces the method "clay" to both oo::object # Meta description and oo::class which facilitate complex interactions between objects # Meta description and their ancestor and mixed in classes. # Meta category TclOO # Meta subject framework # Meta require {Tcl 8.6} # Meta author Sean Woods # Meta license BSD # @@ Meta End ### # Amalgamated package for clay # Do not edit directly, tweak the source in build/ and rerun # build.tcl ### package provide clay 0.8.6 namespace eval ::clay {} ### # START: procs.tcl ### namespace eval ::clay { } set ::clay::trace 0 if {[info commands ::cron::object_destroy] eq {}} { # Provide a noop if we aren't running with the cron scheduler namespace eval ::cron {} proc ::cron::object_destroy args {} } proc ::clay::PROC {name arglist body {ninja {}}} { if {[info commands $name] ne {}} return proc $name $arglist $body eval $ninja } if {[info commands ::PROC] eq {}} { namespace eval ::clay { namespace export PROC } |
︙ | ︙ | |||
198 199 200 201 202 203 204 205 206 207 208 209 210 211 | namespace eval ::clay { namespace export K } namespace eval :: { namespace import ::clay::K } } proc ::clay::noop args {} if {[info commands ::noop] eq {}} { namespace eval ::clay { namespace export noop } namespace eval :: { namespace import ::clay::noop } } proc ::clay::path args { set result {} foreach item $args { set item [string trim $item :./] foreach subitem [split $item /] { lappend result [string trim ${subitem}]/ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 | namespace eval ::clay { namespace export K } namespace eval :: { namespace import ::clay::K } } proc ::clay::noop args {} if {[info commands ::noop] eq {}} { namespace eval ::clay { namespace export noop } namespace eval :: { namespace import ::clay::noop } } proc ::clay::cleanup {} { set count 0 if {![info exists ::clay::idle_destroy]} return set objlist $::clay::idle_destroy set ::clay::idle_destroy {} foreach obj $objlist { if {![catch {$obj destroy}]} { incr count } } return $count } proc ::clay::object_create {objname {class {}}} { #if {$::clay::trace>0} { # puts [list $objname CREATE] #} } proc ::clay::object_rename {object newname} { if {$::clay::trace>0} { puts [list $object RENAME -> $newname] } } proc ::clay::object_destroy args { if {![info exists ::clay::idle_destroy]} { set ::clay::idle_destroy {} } foreach objname $args { if {$::clay::trace>0} { puts [list $objname DESTROY] } ::cron::object_destroy $objname if {$objname in $::clay::idle_destroy} continue lappend ::clay::idle_destroy $objname } } proc ::clay::path args { set result {} foreach item $args { set item [string trim $item :./] foreach subitem [split $item /] { lappend result [string trim ${subitem}]/ |
︙ | ︙ | |||
1101 1102 1103 1104 1105 1106 1107 | ### ::namespace eval ::clay::define { } proc ::clay::ensemble_methodbody {ensemble einfo} { set default standard set preamble {} set eswitch {} | < | < < < | < < < < < < < < < < | < < | | < < < | | < < < < | | | | < | < < | > | < < < < < | | | | < > > | < > | | | | < | | > | > | | | | < > > > | < | < < < < | | 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 | ### ::namespace eval ::clay::define { } proc ::clay::ensemble_methodbody {ensemble einfo} { set default standard set preamble {} set eswitch {} set Ensemble [string totitle $ensemble] if {$Ensemble eq "."} continue foreach {msubmethod minfo} [lsort -dictionary -stride 2 $einfo] { if {$msubmethod eq "."} continue if {![dict exists $minfo body:]} { continue } set submethod [string trim $msubmethod :/-] if {$submethod eq "default"} { set default [dict get $minfo body:] } else { dict set eswitch $submethod [dict get $minfo body:] } if {[dict exists $submethod aliases:]} { foreach alias [dict get $minfo aliases:] { if {![dict exists $eswitch $alias]} { dict set eswitch $alias [dict get $minfo body:] } } } } set methodlist [lsort -dictionary [dict keys $eswitch]] if {![dict exists $eswitch <list>]} { dict set eswitch <list> {return $methodlist} } if {$default eq "standard"} { set default "error \"unknown method $ensemble \$method. Valid: \$methodlist\"" } dict set eswitch default $default set mbody {} append mbody \n [list set methodlist $methodlist] append mbody \n "switch -- \$method \{$eswitch\}" \n return $mbody } ::proc ::clay::define::Ensemble {rawmethod args} { if {[llength $args]==2} { lassign $args argspec body set argstyle tcl } elseif {[llength $args]==3} { lassign $args argstyle argspec body } else { error "Usage: Ensemble name ?argstyle? argspec body" } set class [current_class] #if {$::clay::trace>2} { # puts [list $class Ensemble $rawmethod $argspec $body] #} set mlist [split $rawmethod "::"] set ensemble [string trim [lindex $mlist 0] :/] set method [string trim [lindex $mlist 2] :/] if {[string index $method 0] eq "_"} { $class clay set method_ensemble $ensemble $method $body return } set realmethod [string totitle $ensemble]_${method} set realbody {} if {$argstyle eq "dictargs"} { append realbody "::dictargs::parse \{$argspec\} \$args" \n } if {[$class clay exists method_ensemble $ensemble _preamble]} { append realbody [$class clay get method_ensemble $ensemble _preamble] \n } append realbody $body if {$method eq "default"} { $class clay set method_ensemble $ensemble $method: "tailcall my $realmethod \$method {*}\$args" if {$argstyle eq "dictargs"} { oo::define $class method $realmethod [list method [list args $argspec]] $realbody } else { oo::define $class method $realmethod [list method {*}$argspec] $realbody } } else { $class clay set method_ensemble $ensemble $method: "tailcall my $realmethod {*}\$args" if {$argstyle eq "dictargs"} { oo::define $class method $realmethod [list [list args $argspec]] $realbody } else { oo::define $class method $realmethod $argspec $realbody } } if {$::clay::trace>2} { puts [list $class clay set method_ensemble/ $ensemble [string trim $method :/] ...] } } ### # END: ensemble.tcl ### ### |
︙ | ︙ | |||
1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 | } branch { set path [::clay::tree::storage $args] if {![dict exists $clay {*}$path .]} { dict set clay {*}$path . {} } } cget { # Leaf searches return one data field at a time # Search in our local dict if {[llength $args]==1} { set field [string trim [lindex $args 0] -:/] if {[info exists option_canonical($field)]} { set field $option_canonical($field) | > > > > > > > > > > > > > > > > | 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 | } branch { set path [::clay::tree::storage $args] if {![dict exists $clay {*}$path .]} { dict set clay {*}$path . {} } } busy { my variable clay_busy if {[llength $args]} { set clay_busy [string is true [lindex $args 0]] set claycache {} } if {![info exists clay_busy]} { set clay_busy 0 } return $clay_busy } cache { set path [lindex $args 0] set value [lindex $args 1] dict set claycache $path $value } cget { # Leaf searches return one data field at a time # Search in our local dict if {[llength $args]==1} { set field [string trim [lindex $args 0] -:/] if {[info exists option_canonical($field)]} { set field $option_canonical($field) |
︙ | ︙ | |||
1475 1476 1477 1478 1479 1480 1481 | foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return $result } ensemble_map { | | < < | | | > > > > > > > > > > > > > > > > > > > > | | | 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 | foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return $result } ensemble_map { set path [::clay::tree::storage method_ensemble] if {[dict exists $claycache {*}$path]} { return [dict get $claycache {*}$path] } set emap {} foreach class $clayorder { if {![$class clay exists {*}$path .]} continue dict for {ensemble einfo} [$class clay dget {*}$path] { if {$ensemble eq "."} continue dict for {method body} $einfo { if {$method eq "."} continue dict set emap $ensemble $method class: $class dict set emap $ensemble $method body: $body } } } if {[dict exists $clay {*}$path]} { dict for {ensemble einfo} [dict get $clay {*}$path] { dict for {method body} $einfo { if {$method eq "."} continue dict set emap $ensemble $method class: $class dict set emap $ensemble $method body: $body } } } dict set claycache {*}$path $emap return $emap } eval { set script [lindex $args 0] set buffer {} set thisline {} foreach line [split $script \n] { append thisline $line |
︙ | ︙ | |||
1555 1556 1557 1558 1559 1560 1561 | # Search in the in our list of classes for an answer foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return $result } | < < < < < < < > > > > > | | < < < < < < < > > > > > > > > | | | > | > > | < < | > | 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 | # Search in the in our list of classes for an answer foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return $result } if {[dict exists $clay {*}$path] && ![dict exists $clay {*}$path .]} { # Path is a leaf return [dict get $clay {*}$path] } # Search in our local cache if {[my clay search $path value isleaf]} { return $value } set found 0 set branch [dict exists $clay {*}$path .] foreach class $clayorder { if {[$class clay exists {*}$path .]} { set found 1 break } if {!$branch && [$class clay exists {*}$path]} { set result [$class clay dget {*}$path] my clay cache $path $result return $result } } # Path is a branch set result [dict getnull $clay {*}$path] foreach class $clayorder { if {![$class clay exists {*}$path .]} continue ::clay::tree::dictmerge result [$class clay dget {*}$path] } #if {[dict exists $clay {*}$path .]} { # ::clay::tree::dictmerge result #} my clay cache $path $result return $result } getnull - get { set path [::clay::tree::storage $args] if {[llength $path]==0} { # Do a full dump of clay data set result {} # Search in the in our list of classes for an answer foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return [::clay::tree::sanitize $result] } if {[dict exists $clay {*}$path] && ![dict exists $clay {*}$path .]} { # Path is a leaf return [dict get $clay {*}$path] } # Search in our local cache if {[my clay search $path value isleaf]} { if {!$isleaf} { return [clay::tree::sanitize $value] } else { return $value } } set found 0 set branch [dict exists $clay {*}$path .] foreach class $clayorder { if {[$class clay exists {*}$path .]} { set found 1 break } if {!$branch && [$class clay exists {*}$path]} { set result [$class clay dget {*}$path] my clay cache $path $result return $result } } # Path is a branch set result [dict getnull $clay {*}$path] #foreach class [lreverse $clayorder] { # if {![$class clay exists {*}$path .]} continue # ::clay::tree::dictmerge result [$class clay dget {*}$path] #} foreach class $clayorder { if {![$class clay exists {*}$path .]} continue ::clay::tree::dictmerge result [$class clay dget {*}$path] } #if {[dict exists $clay {*}$path .]} { # ::clay::tree::dictmerge result [dict get $clay {*}$path] #} my clay cache $path $result return [clay::tree::sanitize $result] } leaf { # Leaf searches return one data field at a time # Search in our local dict set path [::clay::tree::storage $args] if {[dict exists $clay {*}$path .]} { return [clay::tree::sanitize [dict get $clay {*}$path]] } if {[dict exists $clay {*}$path]} { return [dict get $clay {*}$path] } # Search in our local cache if {[my clay search $path value isleaf]} { if {!$isleaf} { return [clay::tree::sanitize $value] } else { return $value } } # Search in the in our list of classes for an answer foreach class $clayorder { if {[$class clay exists {*}$path]} { set value [$class clay get {*}$path] my clay cache $path $value return $value } } } merge { foreach arg $args { ::clay::tree::dictmerge clay {*}$arg } } mixin { ### # Mix in the class ### my clay flush set prior [info object mixins [self]] set newmixin {} foreach item $args { lappend newmixin ::[string trimleft $item :] } set newmap $args foreach class $prior { |
︙ | ︙ | |||
1722 1723 1724 1725 1726 1727 1728 | puts stderr "[self] MIXIN ERROR PEEKING $class:\n[dict get $errdat -errorinfo]" } break } } } mixinmap { | < | 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 | puts stderr "[self] MIXIN ERROR PEEKING $class:\n[dict get $errdat -errorinfo]" } break } } } mixinmap { if {![dict exists $clay .mixin]} { dict set clay .mixin {} } if {[llength $args]==0} { return [dict get $clay .mixin] } elseif {[llength $args]==1} { return [dict getnull $clay .mixin [lindex $args 0]] |
︙ | ︙ | |||
1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 | if {$refcount <= 0} { ::clay::object_destroy [self] } } replace { set clay [lindex $args 0] } source { source [lindex $args 0] } set { #puts [list [self] clay SET {*}$args] | > > > > > > > > > > < | > > > > > | 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 | if {$refcount <= 0} { ::clay::object_destroy [self] } } replace { set clay [lindex $args 0] } search { set path [lindex $args 0] upvar 1 [lindex $args 1] value [lindex $args 2] isleaf set isleaf [expr {![dict exists $claycache $path .]}] if {[dict exists $claycache $path]} { set value [dict get $claycache $path] return 1 } return 0 } source { source [lindex $args 0] } set { #puts [list [self] clay SET {*}$args] ::clay::tree::dictset clay {*}$args } default { dict $submethod clay {*}$args } } } method InitializePublic {} { my variable clayorder clay claycache config option_canonical clay_busy if {[info exists clay_busy] && $clay_busy} { # Avoid repeated calls to InitializePublic if we know that someone is # going to invoke it at the end of whatever process is going on return } set claycache {} set clayorder [::clay::ancestors [info object class [self]] {*}[lreverse [info object mixins [self]]]] if {![info exists clay]} { set clay {} } if {![info exists config]} { set config {} |
︙ | ︙ | |||
1855 1856 1857 1858 1859 1860 1861 | } dict set config $field $value set setcmd [dict getnull $info set-command] if {$setcmd ne {}} { {*}[string map [list %field% [list $field] %value% [list $value] %self% [namespace which my]] $setcmd] } } | < < < < < | < < < < < < < < < < < < < < < < < < < < < < | > | 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 | } dict set config $field $value set setcmd [dict getnull $info set-command] if {$setcmd ne {}} { {*}[string map [list %field% [list $field] %value% [list $value] %self% [namespace which my]] $setcmd] } } foreach {ensemble einfo} [my clay ensemble_map] { #if {[dict exists $einfo _body]} continue if {$ensemble eq "."} continue set body [::clay::ensemble_methodbody $ensemble $einfo] if {$::clay::trace>2} { set rawbody $body set body {puts [list [self] <object> [self method]]} append body \n $rawbody } oo::objdefine [self] method $ensemble {{method default} args} $body |
︙ | ︙ | |||
2099 2100 2101 2102 2103 2104 2105 | } } } ### # END: event.tcl ### | > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 | } } } ### # END: event.tcl ### ### # START: singleton.tcl ### proc ::clay::singleton {name script} { if {[info commands $name] eq {}} { ::clay::object create $name } oo::objdefine $name { method SingletonProcs {} { proc class class { uplevel 1 "oo::objdefine \[self\] class $class" my clay delegate class $class } proc clay args { my clay {*}$args } proc Ensemble {rawmethod args} { if {[llength $args]==2} { lassign $args argspec body set argstyle tcl } elseif {[llength $args]==3} { lassign $args argstyle argspec body } else { error "Usage: Ensemble name ?argstyle? argspec body" } set class [uplevel 1 self] #if {$::clay::trace>2} { # puts [list $class Ensemble $rawmethod $argspec $body] #} set mlist [split $rawmethod "::"] set ensemble [string trim [lindex $mlist 0] :/] set method [string trim [lindex $mlist 2] :/] if {[string index $method 0] eq "_"} { $class clay set method_ensemble $ensemble $method $body return } set realmethod [string totitle $ensemble]_${method} set realbody {} if {$argstyle eq "dictargs"} { append realbody "::dictargs::parse \{$argspec\} \$args" \n } if {[$class clay exists method_ensemble $ensemble _preamble]} { append realbody [$class clay get method_ensemble $ensemble _preamble] \n } append realbody $body if {$method eq "default"} { $class clay set method_ensemble $ensemble $method: "tailcall my $realmethod \$method {*}\$args" if {$argstyle eq "dictargs"} { oo::objdefine $class method $realmethod [list method [list args $argspec]] $realbody } else { oo::objdefine $class method $realmethod [list method {*}$argspec] $realbody } } else { $class clay set method_ensemble $ensemble $method: "tailcall my $realmethod {*}\$args" if {$argstyle eq "dictargs"} { oo::objdefine $class method $realmethod [list [list args $argspec]] $realbody } else { oo::objdefine $class method $realmethod $argspec $realbody } } if {$::clay::trace>2} { puts [list $class clay set method_ensemble/ $ensemble [string trim $method :/] ...] } } proc method args { uplevel 1 "oo::objdefine \[self\] method {*}$args" } } method script script { my clay busy 1 my SingletonProcs eval $script my clay busy 0 my InitializePublic } } $name script $script return $name } ### # END: singleton.tcl ### namespace eval ::clay { namespace export * } |
Changes to modules/clay/clay.test.
︙ | ︙ | |||
856 857 858 859 860 861 862 863 864 865 866 867 868 869 | clay set {const/ sound} zoink clay set info/ { animal no building no subelement {pedantic yes} } } test oo-class-clay-method-0001 "Test ::foo::classa const/ color exists" { ::foo::classa clay exists const/ color } 1 | > > > > > > > > > > > > | 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 | clay set {const/ sound} zoink clay set info/ { animal no building no subelement {pedantic yes} } # Provide a method that returns a constant so we can compare clay's inheritance to # TclOO method color {} { return blue } method flavor {} { return strawberry } method sound {} { return zoink } } test oo-class-clay-method-0001 "Test ::foo::classa const/ color exists" { ::foo::classa clay exists const/ color } 1 |
︙ | ︙ | |||
921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 | test oo-class-clay-method-0011 "Test ::foo::classa info/ subelement value" { ::foo::classa clay get info/ subelement } {pedantic yes} clay::define ::foo::classb { clay set const/ color black clay set const/ flavor vanilla clay set const/ feeling dread clay set info/ subelement {spoon yes} } test oo-class-clay-method-0013 "Test ::foo::classb const/ color exists" { ::foo::classb clay exists const/ color } 1 | > > > > | 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 | test oo-class-clay-method-0011 "Test ::foo::classa info/ subelement value" { ::foo::classa clay get info/ subelement } {pedantic yes} clay::define ::foo::classb { clay set const/ color black method color {} {return black} clay set const/ flavor vanilla method flavor {} {return vanilla} clay set const/ feeling dread method feeling {} {return dread} clay set info/ subelement {spoon yes} method subelement {} {return {spoon yes}} } test oo-class-clay-method-0013 "Test ::foo::classb const/ color exists" { ::foo::classb clay exists const/ color } 1 |
︙ | ︙ | |||
978 979 980 981 982 983 984 985 986 987 988 989 990 991 | clay::define ::foo::class.ba { superclass ::foo::classa ::foo::classb } # ------------------------------------------------------------------------- # OBJECT of ::foo::classa set OBJECTA [::foo::classa new] ### # Test object degation ### proc ::foo::fakeobject {a b} { | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 | clay::define ::foo::class.ba { superclass ::foo::classa ::foo::classb } # ------------------------------------------------------------------------- # Singleton ::clay::define ::test::singletonbehavior { method bar {} { return CLASS } method booze {} { return CLASS } Ensemble foo::bang {} { return CLASS } Ensemble foo::both {} { return CLASS } Ensemble foo::mixin {} { return CLASS } Ensemble foo::sloppy {} { return CLASS } } ::clay::define ::test::flavor.strawberry { clay define property flavor strawbery method bar {} { return STRAWBERRY } Ensemble foo::bing {} { return STRAWBERRY } Ensemble foo::both {} { return STRAWBERRY } Ensemble foo::mixin {} { return STRAWBERRY } Ensemble foo::sloppy {} { return STRAWBERRY } } ::clay::singleton ::TEST { class ::test::singletonbehavior clay mixinmap flavor ::test::flavor.strawberry clay set property color green method bar {} { return OBJECT } method booze {} { return OBJECT } method baz {} { return OBJECT } Ensemble foo::bar {} { return OBJECT } Ensemble foo::both {} { return OBJECT } } test oo-object-singleton-001 {Test singleton superclass keyword} { ::TEST clay delegate class } {::test::singletonbehavior} test oo-object-singleton-002 {Test singleton ensemble 1} { ::TEST foo <list> } {bang bar bing both mixin sloppy} test oo-object-singleton-003 {Test singleton ensemble from script} { ::TEST foo bar } {OBJECT} test oo-object-singleton-004 {Test singleton ensemble from mixin} { ::TEST foo bing } {STRAWBERRY} test oo-object-singleton-005 {Test singleton ensemble from class} { ::TEST foo bang } {CLASS} # Test note: the behavior from TclOO is unexpected # Intuitively, a local method should override a mixin # but this is not the case test oo-object-singleton-006 {Test singleton ensemble from conflict, should resolve to object} { ::TEST foo both } {STRAWBERRY} test oo-object-singleton-007 {Test singleton ensemble from conflict, should resolve to mixin} { ::TEST foo sloppy } {STRAWBERRY} ### # Test note: # This should work but does not ### #test oo-object-singleton-009 {Test property from mixin/class} { # ::TEST clay get property flavor #} {strawberry} test oo-object-singleton-008 {Test property from script} { ::TEST clay get property color } {green} # Test note: the behavior from TclOO is unexpected # Intuitively, a local method should override a mixin # but this is not the case test oo-object-singleton-010 {Test method declared in script} { ::TEST bar } {STRAWBERRY} test oo-object-singleton-011 {Test method declared in script} { ::TEST booze } {OBJECT} TEST destroy # OBJECT of ::foo::classa set OBJECTA [::foo::classa new] ### # Test object degation ### proc ::foo::fakeobject {a b} { |
︙ | ︙ | |||
1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 | test oo-object-clay-method-native-0001 {Test native object gets the property const//color} { $OBJECTA clay get const/ color } {blue} test oo-object-clay-method-mixin-0001 {Test mixin object gets the property const//color} { $MIXINA clay get const/ color } {blue} test oo-object-clay-method-native-0002 {Test native object gets the property const//flavor} { $OBJECTA clay get const/ flavor } {strawberry} test oo-object-clay-method-mixin-0002 {Test mixin object gets the property const//flavor} { $MIXINA clay get const/ flavor } {strawberry} test oo-object-clay-method-native-0003 {Test native object gets the property const//sound} { $OBJECTA clay get const/ sound } {zoink} test oo-object-clay-method-mixin-0003 {Test mixin object gets the property const//sound} { $MIXINA clay get const/ sound } {zoink} test oo-object-clay-method-native-0004 {Test native object gets the property info//animal} { $OBJECTA clay get info/ animal } {no} test oo-object-clay-method-mixin-0004 {Test mixin object gets the property info//animal} { $MIXINA clay get info/ animal } {no} | > > > > > > > > > > > > > > > > > > > > > > > > | 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 | test oo-object-clay-method-native-0001 {Test native object gets the property const//color} { $OBJECTA clay get const/ color } {blue} test oo-object-clay-method-mixin-0001 {Test mixin object gets the property const//color} { $MIXINA clay get const/ color } {blue} test oo-object-clay-method-native-methodcheck-0001 {Test that const//color would mimic method interheritance for a native class} { $OBJECTA color } {blue} test oo-object-clay-method-mixin-0001 {Test that const//color would mimic method interheritance for a mixed in class} { $MIXINA color } {blue} test oo-object-clay-method-native-0002 {Test native object gets the property const//flavor} { $OBJECTA clay get const/ flavor } {strawberry} test oo-object-clay-method-mixin-0002 {Test mixin object gets the property const//flavor} { $MIXINA clay get const/ flavor } {strawberry} test oo-object-clay-method-native-methodcheck-0002 {Test that const//flavor would mimic method interheritance for a native class} { $OBJECTA flavor } {strawberry} test oo-object-clay-method-mixin-0002 {Test that const//flavor would mimic method interheritance for a mixed in class} { $MIXINA flavor } {strawberry} test oo-object-clay-method-native-0003 {Test native object gets the property const//sound} { $OBJECTA clay get const/ sound } {zoink} test oo-object-clay-method-mixin-0003 {Test mixin object gets the property const//sound} { $MIXINA clay get const/ sound } {zoink} test oo-object-clay-method-native-methodcheck-0003 {Test that const//sound would mimic method interheritance for a native class} { $OBJECTA sound } {zoink} test oo-object-clay-method-mixin-0003 {Test that const//sound would mimic method interheritance for a mixed in class} { $MIXINA sound } {zoink} test oo-object-clay-method-native-0004 {Test native object gets the property info//animal} { $OBJECTA clay get info/ animal } {no} test oo-object-clay-method-mixin-0004 {Test mixin object gets the property info//animal} { $MIXINA clay get info/ animal } {no} |
︙ | ︙ | |||
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 | test oo-object-clay-method-native-0007 {Test native object gets the property const//color} { $OBJECTB clay get const/ color } {black} test oo-object-clay-method-mixin-0007 {Test mixin object gets the property const//color} { $MIXINB clay get const/ color } {black} test oo-object-clay-method-native-0008 {Test native object gets the property const//flavor} { $OBJECTB clay get const/ flavor } {vanilla} test oo-object-clay-method-mixin-0008 {Test mixin object gets the property const//flavor} { $MIXINB clay get const/ flavor } {vanilla} test oo-object-clay-method-native-0009 {Test native object gets the property const//feeling} { $OBJECTB clay get const/ feeling } {dread} test oo-object-clay-method-mixin-0009 {Test mixin object gets the property const//feeling} { $MIXINB clay get const/ feeling } {dread} test oo-object-clay-method-native-0010 {Test native object gets the property info//subelement} { $OBJECTB clay get info/ subelement } {spoon yes} test oo-object-clay-method-mixin-0010 {Test mixin object gets the property info//subelement} { $MIXINB clay get info/ subelement } {spoon yes} | > > > > > > > > > > > > > > > > > > > > > > > > | 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 | test oo-object-clay-method-native-0007 {Test native object gets the property const//color} { $OBJECTB clay get const/ color } {black} test oo-object-clay-method-mixin-0007 {Test mixin object gets the property const//color} { $MIXINB clay get const/ color } {black} test oo-object-clay-method-native-methodcheck-0007 {Test that const//color would mimic method interheritance for a native class} { $OBJECTB color } {black} test oo-object-clay-method-mixin-0007 {Test that const//color would mimic method interheritance for a mixed in class} { $MIXINB color } {black} test oo-object-clay-method-native-0008 {Test native object gets the property const//flavor} { $OBJECTB clay get const/ flavor } {vanilla} test oo-object-clay-method-mixin-0008 {Test mixin object gets the property const//flavor} { $MIXINB clay get const/ flavor } {vanilla} test oo-object-clay-method-native-methodcheck-0008 {Test that const//flavor would mimic method interheritance for a native class} { $OBJECTB flavor } {vanilla} test oo-object-clay-method-mixin-0008 {Test that const//flavor would mimic method interheritance for a mixed in class} { $MIXINB flavor } {vanilla} test oo-object-clay-method-native-0009 {Test native object gets the property const//feeling} { $OBJECTB clay get const/ feeling } {dread} test oo-object-clay-method-mixin-0009 {Test mixin object gets the property const//feeling} { $MIXINB clay get const/ feeling } {dread} test oo-object-clay-method-native-methodcheck-0009 {Test that const//feeling would mimic method interheritance for a native class} { $OBJECTB feeling } {dread} test oo-object-clay-method-mixin-0009 {Test that const//feeling would mimic method interheritance for a mixed in class} { $MIXINB feeling } {dread} test oo-object-clay-method-native-0010 {Test native object gets the property info//subelement} { $OBJECTB clay get info/ subelement } {spoon yes} test oo-object-clay-method-mixin-0010 {Test mixin object gets the property info//subelement} { $MIXINB clay get info/ subelement } {spoon yes} |
︙ | ︙ | |||
1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 | test oo-object-clay-method-native-0011 {Test native object gets the property const//color} { $OBJECTAB clay get const/ color } {black} test oo-object-clay-method-mixin-0011 {Test mixin object gets the property const//color} { $MIXINAB clay get const/ color } {black} test oo-object-clay-method-native-0012 {Test native object gets the property const//flavor} { $OBJECTAB clay get const/ flavor } {vanilla} test oo-object-clay-method-mixin-0012 {Test mixin object gets the property const//flavor} { $MIXINAB clay get const/ flavor } {vanilla} test oo-object-clay-method-native-0013 {Test native object gets the property const//feeling} { $OBJECTAB clay get const/ feeling } {dread} test oo-object-clay-method-mixin-0013 {Test mixin object gets the property const//feeling} { $MIXINAB clay get const/ feeling } {dread} test oo-object-clay-method-native-0014 {Test native object gets the property const//sound} { $OBJECTAB clay get const/ sound } {zoink} test oo-object-clay-method-mixin-0014 {Test mixin object gets the property const//sound} { $MIXINAB clay get const/ sound } {zoink} test oo-object-clay-method-native-0015 {Test native object gets the property info//subelement} { $OBJECTAB clay get info/ subelement } {spoon yes} test oo-object-clay-method-mixin-0015 {Test mixin object gets the property info//subelement} { $MIXINAB clay get info/ subelement } {spoon yes} | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 | test oo-object-clay-method-native-0011 {Test native object gets the property const//color} { $OBJECTAB clay get const/ color } {black} test oo-object-clay-method-mixin-0011 {Test mixin object gets the property const//color} { $MIXINAB clay get const/ color } {black} test oo-object-clay-method-native-methodcheck-0011 {Test that const//color would mimic method interheritance for a native class} { $OBJECTAB color } {black} test oo-object-clay-method-mixin-0011 {Test that const//color would mimic method interheritance for a mixed in class} { $MIXINAB color } {black} test oo-object-clay-method-native-0012 {Test native object gets the property const//flavor} { $OBJECTAB clay get const/ flavor } {vanilla} test oo-object-clay-method-mixin-0012 {Test mixin object gets the property const//flavor} { $MIXINAB clay get const/ flavor } {vanilla} test oo-object-clay-method-native-methodcheck-0012 {Test that const//flavor would mimic method interheritance for a native class} { $OBJECTAB flavor } {vanilla} test oo-object-clay-method-mixin-0012 {Test that const//flavor would mimic method interheritance for a mixed in class} { $MIXINAB flavor } {vanilla} test oo-object-clay-method-native-0013 {Test native object gets the property const//feeling} { $OBJECTAB clay get const/ feeling } {dread} test oo-object-clay-method-mixin-0013 {Test mixin object gets the property const//feeling} { $MIXINAB clay get const/ feeling } {dread} test oo-object-clay-method-native-methodcheck-0013 {Test that const//feeling would mimic method interheritance for a native class} { $OBJECTAB feeling } {dread} test oo-object-clay-method-mixin-0013 {Test that const//feeling would mimic method interheritance for a mixed in class} { $MIXINAB feeling } {dread} test oo-object-clay-method-native-0014 {Test native object gets the property const//sound} { $OBJECTAB clay get const/ sound } {zoink} test oo-object-clay-method-mixin-0014 {Test mixin object gets the property const//sound} { $MIXINAB clay get const/ sound } {zoink} test oo-object-clay-method-native-methodcheck-0014 {Test that const//sound would mimic method interheritance for a native class} { $OBJECTAB sound } {zoink} test oo-object-clay-method-mixin-0014 {Test that const//sound would mimic method interheritance for a mixed in class} { $MIXINAB sound } {zoink} test oo-object-clay-method-native-0015 {Test native object gets the property info//subelement} { $OBJECTAB clay get info/ subelement } {spoon yes} test oo-object-clay-method-mixin-0015 {Test mixin object gets the property info//subelement} { $MIXINAB clay get info/ subelement } {spoon yes} |
︙ | ︙ | |||
1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 | test oo-object-clay-method-native-0018 {Test native object gets the property} { $OBJECTBA clay get const/ color } {blue} test oo-object-clay-method-mixin-0018 {Test mixin object gets the property} { $MIXINBA clay get const/ color } {blue} test oo-object-clay-method-native-0019 {Test native object gets the property} { $OBJECTBA clay get const/ flavor } {strawberry} test oo-object-clay-method-mixin-0019 {Test mixin object gets the property} { $MIXINBA clay get const/ flavor } {strawberry} test oo-object-clay-method-native-0020 {Test native object gets the property} { $OBJECTBA clay get const/ sound } {zoink} test oo-object-clay-method-mixin-0020 {Test mixin object gets the property} { $MIXINBA clay get const/ sound } {zoink} test oo-object-clay-method-native-0021 {Test native object gets the property} { $OBJECTBA clay get const/ feeling } {dread} test oo-object-clay-method-mixin-0021 {Test mixin object gets the property} { $MIXINBA clay get const/ feeling } {dread} test oo-object-clay-method-native-0022 {Test native object gets the property} { $OBJECTBA clay get info/ animal } {no} test oo-object-clay-method-mixin-0022 {Test mixin object gets the property} { $MIXINBA clay get info/ animal } {no} | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 | test oo-object-clay-method-native-0018 {Test native object gets the property} { $OBJECTBA clay get const/ color } {blue} test oo-object-clay-method-mixin-0018 {Test mixin object gets the property} { $MIXINBA clay get const/ color } {blue} test oo-object-clay-method-native-methodcheck-0018 {Test that const//color would mimic method interheritance for a native class} { $OBJECTBA color } {blue} test oo-object-clay-method-mixin-0018 {Test that const//color would mimic method interheritance for a mixed in class} { $MIXINBA color } {blue} test oo-object-clay-method-native-0019 {Test native object gets the property} { $OBJECTBA clay get const/ flavor } {strawberry} test oo-object-clay-method-mixin-0019 {Test mixin object gets the property} { $MIXINBA clay get const/ flavor } {strawberry} test oo-object-clay-method-native-methodcheck-0019 {Test that const//flavor would mimic method interheritance for a native class} { $OBJECTBA flavor } {strawberry} test oo-object-clay-method-mixin-0019 {Test that const//flavor would mimic method interheritance for a mixed in class} { $MIXINBA flavor } {strawberry} test oo-object-clay-method-native-0020 {Test native object gets the property} { $OBJECTBA clay get const/ sound } {zoink} test oo-object-clay-method-mixin-0020 {Test mixin object gets the property} { $MIXINBA clay get const/ sound } {zoink} test oo-object-clay-method-native-methodcheck-0020 {Test that const//sound would mimic method interheritance for a native class} { $OBJECTBA sound } {zoink} test oo-object-clay-method-mixin-0020 {Test that const//sound would mimic method interheritance for a mixed in class} { $MIXINBA sound } {zoink} test oo-object-clay-method-native-0021 {Test native object gets the property} { $OBJECTBA clay get const/ feeling } {dread} test oo-object-clay-method-mixin-0021 {Test mixin object gets the property} { $MIXINBA clay get const/ feeling } {dread} test oo-object-clay-method-native-methodcheck-0021 {Test that const//feeling would mimic method interheritance for a native class} { $OBJECTBA feeling } {dread} test oo-object-clay-method-mixin-0021 {Test that const//feeling would mimic method interheritance for a mixed in class} { $MIXINBA feeling } {dread} test oo-object-clay-method-native-0022 {Test native object gets the property} { $OBJECTBA clay get info/ animal } {no} test oo-object-clay-method-mixin-0022 {Test mixin object gets the property} { $MIXINBA clay get info/ animal } {no} |
︙ | ︙ | |||
1326 1327 1328 1329 1330 1331 1332 | method do args { return "I did $args" } Ensemble which::color {} { return [my clay get color] } | | | 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 | method do args { return "I did $args" } Ensemble which::color {} { return [my clay get color] } clay set method_ensemble which farbe: {tailcall my Which_color {*}$args} } ### # Test clay information is passed town to subclasses ### test clay-class-clay-0003 {Test that a clay statement is recorded in the object of the class} { ::TEST::myclasse clay get color |
︙ | ︙ | |||
1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 | $OBJ3 which color } black # Test setting properties test clay-object-method-0004 {Test an ensemble alias} { $OBJ3 which farbe } black ### # Test that if you try to replace a global command you get an error ### test clay-nspace-0001 {Test that if you try to replace a global command you get an error} -body { ::clay::define open { method bar {} { return foo } | > > > > > > > > > > > > > > > > > > > > > > | 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 | $OBJ3 which color } black # Test setting properties test clay-object-method-0004 {Test an ensemble alias} { $OBJ3 which farbe } black ### # Added 2019-06-24 # Test that grabbing a leaf does not pollute the cache ### ::clay::define ::TEST::class_with_deep_tree { clay set tree deep has depth 1 clay set tree shallow has depth 0 } $OBJ3 clay mixinmap deep ::TEST::class_with_deep_tree test clay-deep-nested-0001 {Test that a leaf query does not pollute the cache} { $OBJ3 clay get tree shallow has depth } 0 test clay-deep-nested-0001 {Test that a leaf query does not pollute the cache} { $OBJ3 clay get tree } {deep {has {depth 1}} shallow {has {depth 0}}} ### # Test that if you try to replace a global command you get an error ### test clay-nspace-0001 {Test that if you try to replace a global command you get an error} -body { ::clay::define open { method bar {} { return foo } |
︙ | ︙ | |||
1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 | } {::cluster::fubar} test clay-nspace-0003 {Test a fully qualified class ends up in the proper namespace} { info commands ::clay::pot } {::clay::pot} #set ::clay::trace 3 ### # Mixin tests ### ### # Define a core class ### | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 | } {::cluster::fubar} test clay-nspace-0003 {Test a fully qualified class ends up in the proper namespace} { info commands ::clay::pot } {::clay::pot} #set ::clay::trace 3 ### # New test - Added 2019-09-15 # Test that the "method" variable is exposed to a default method ### ::clay::define ::ensembleWithDefault { Ensemble foo::bar {} { return A } Ensemble foo::baz {} { return B } Ensemble foo::bang {} { return C } Ensemble foo::default {} { return $method } } set OBJ [::ensembleWithDefault new] test clay-ensemble-default-0001 {Test a normal ensemble method} { $OBJ foo bar } {A} test clay-ensemble-default-0002 {Test a normal ensemble method} { $OBJ foo baz } {B} test clay-ensemble-default-0003 {Test a normal ensemble method} { $OBJ foo <list> } [lsort -dictionary {bar baz bang}] test clay-ensemble-default-0004 {Test a normal ensemble method} { $OBJ foo bing } {bing} test clay-ensemble-default-0005 {Test a normal ensemble method} { $OBJ foo bong } {bong} ### # Mixin tests ### ### # Define a core class ### |
︙ | ︙ | |||
1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 | Ensemble which::flavor {} { return [my clay get flavor] } Ensemble which::color {} { return [my clay get color] } } ::clay::define ::TEST::animal { clay color unknown clay sound unknown Ensemble which::sound {} { return [my clay get sound] } Ensemble which::color {} { return [my clay get color] } } ::clay::define ::TEST::species.cat { superclass ::TEST::animal clay sound meow | > > > > > > | > > > | 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 | Ensemble which::flavor {} { return [my clay get flavor] } Ensemble which::color {} { return [my clay get color] } } ::clay::define ::TEST::animal { clay color unknown clay sound unknown Ensemble which::sound {} { return [my clay get sound] } Ensemble which::color {} { return [my clay get color] } method sound {} { return unknown } } ::clay::define ::TEST::species.cat { superclass ::TEST::animal clay sound meow method sound {} { return meow } } ::clay::define ::TEST::coloring.calico { clay color calico } ::clay::define ::TEST::condition.dark { Ensemble which::color {} { return grey } } ::clay::define ::TEST::mood.happy { Ensemble which::sound {} { return purr } method sound {} { return purr } } test clay-object-0001 {Test than an object is created when clay::define is invoked} { info commands ::TEST::mood.happy } ::TEST::mood.happy set OBJ [::TEST::thing new] |
︙ | ︙ | |||
1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 | test clay-mixin-b-0001 {Test that an ensemble is created during a mixin} { $OBJ which color } {unknown} test clay-mixin-b-0002 {Test that an ensemble is created during a mixin} { $OBJ which sound } {unknown} test clay-mixin-b-0003 {Test that an ensemble is created during a mixin} -body {$OBJ which flavor} -returnCodes {error} -result {unknown method which flavor. Valid: color sound} ### # Test Modified: 2018-10-21 ### test clay-mixin-b-0004 {Test that mixins resolve in the correct order} { $OBJ clay ancestors } {::TEST::animal ::TEST::thing ::clay::object} | > > | 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 | test clay-mixin-b-0001 {Test that an ensemble is created during a mixin} { $OBJ which color } {unknown} test clay-mixin-b-0002 {Test that an ensemble is created during a mixin} { $OBJ which sound } {unknown} test clay-mixin-b-0003 {Test that an ensemble is created during a mixin} -body {$OBJ which flavor} -returnCodes {error} -result {unknown method which flavor. Valid: color sound} ### # Test Modified: 2018-10-21 ### test clay-mixin-b-0004 {Test that mixins resolve in the correct order} { $OBJ clay ancestors } {::TEST::animal ::TEST::thing ::clay::object} |
︙ | ︙ | |||
1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 | ### # Replacing a mixin $OBJ clay mixinmap species ::TEST::species.cat test clay-mixin-e-0001 {Test that an ensemble is created during a mixin} { $OBJ which color } {unknown} test clay-mixin-e-0002 {Test that an ensemble is created during a mixin} { $OBJ which sound } {meow} test clay-mixin-e-0003 {Test that an ensemble is created during a mixin} -body {$OBJ which flavor} -returnCodes {error} -result {unknown method which flavor. Valid: color sound} ### # Test Modified: 2018-10-30, 2018-10-21, 2018-10-10 ### | > > > > > > | 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 | ### # Replacing a mixin $OBJ clay mixinmap species ::TEST::species.cat test clay-mixin-e-0001 {Test that an ensemble is created during a mixin} { $OBJ which color } {unknown} test clay-mixin-e-0002a {Test that an ensemble is created during a mixin} { $OBJ sound } {meow} test clay-mixin-e-0002b {Test that an ensemble is created during a mixin} { $OBJ clay get sound } {meow} test clay-mixin-e-0002 {Test that an ensemble is created during a mixin} { $OBJ which sound } {meow} test clay-mixin-e-0003 {Test that an ensemble is created during a mixin} -body {$OBJ which flavor} -returnCodes {error} -result {unknown method which flavor. Valid: color sound} ### # Test Modified: 2018-10-30, 2018-10-21, 2018-10-10 ### |
︙ | ︙ | |||
3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 | clay set {const/ sound} zoink clay set info/ { animal no building no subelement {pedantic yes} } } test oo-class-clay-method-0001 "Test ::foo::classa const/ color exists" { ::foo::classa clay exists const/ color } 1 | > > > > > > > > > > > > | 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 | clay set {const/ sound} zoink clay set info/ { animal no building no subelement {pedantic yes} } # Provide a method that returns a constant so we can compare clay's inheritance to # TclOO method color {} { return blue } method flavor {} { return strawberry } method sound {} { return zoink } } test oo-class-clay-method-0001 "Test ::foo::classa const/ color exists" { ::foo::classa clay exists const/ color } 1 |
︙ | ︙ | |||
3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 | test oo-class-clay-method-0011 "Test ::foo::classa info/ subelement value" { ::foo::classa clay get info/ subelement } {pedantic yes} clay::define ::foo::classb { clay set const/ color black clay set const/ flavor vanilla clay set const/ feeling dread clay set info/ subelement {spoon yes} } test oo-class-clay-method-0013 "Test ::foo::classb const/ color exists" { ::foo::classb clay exists const/ color } 1 | > > > > | 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 | test oo-class-clay-method-0011 "Test ::foo::classa info/ subelement value" { ::foo::classa clay get info/ subelement } {pedantic yes} clay::define ::foo::classb { clay set const/ color black method color {} {return black} clay set const/ flavor vanilla method flavor {} {return vanilla} clay set const/ feeling dread method feeling {} {return dread} clay set info/ subelement {spoon yes} method subelement {} {return {spoon yes}} } test oo-class-clay-method-0013 "Test ::foo::classb const/ color exists" { ::foo::classb clay exists const/ color } 1 |
︙ | ︙ | |||
3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 | clay::define ::foo::class.ba { superclass ::foo::classa ::foo::classb } # ------------------------------------------------------------------------- # OBJECT of ::foo::classa set OBJECTA [::foo::classa new] ### # Test object degation ### proc ::foo::fakeobject {a b} { | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 | clay::define ::foo::class.ba { superclass ::foo::classa ::foo::classb } # ------------------------------------------------------------------------- # Singleton ::clay::define ::test::singletonbehavior { method bar {} { return CLASS } method booze {} { return CLASS } Ensemble foo::bang {} { return CLASS } Ensemble foo::both {} { return CLASS } Ensemble foo::mixin {} { return CLASS } Ensemble foo::sloppy {} { return CLASS } } ::clay::define ::test::flavor.strawberry { clay define property flavor strawbery method bar {} { return STRAWBERRY } Ensemble foo::bing {} { return STRAWBERRY } Ensemble foo::both {} { return STRAWBERRY } Ensemble foo::mixin {} { return STRAWBERRY } Ensemble foo::sloppy {} { return STRAWBERRY } } ::clay::singleton ::TEST { class ::test::singletonbehavior clay mixinmap flavor ::test::flavor.strawberry clay set property color green method bar {} { return OBJECT } method booze {} { return OBJECT } method baz {} { return OBJECT } Ensemble foo::bar {} { return OBJECT } Ensemble foo::both {} { return OBJECT } } test oo-object-singleton-001 {Test singleton superclass keyword} { ::TEST clay delegate class } {::test::singletonbehavior} test oo-object-singleton-002 {Test singleton ensemble 1} { ::TEST foo <list> } {bang bar bing both mixin sloppy} test oo-object-singleton-003 {Test singleton ensemble from script} { ::TEST foo bar } {OBJECT} test oo-object-singleton-004 {Test singleton ensemble from mixin} { ::TEST foo bing } {STRAWBERRY} test oo-object-singleton-005 {Test singleton ensemble from class} { ::TEST foo bang } {CLASS} # Test note: the behavior from TclOO is unexpected # Intuitively, a local method should override a mixin # but this is not the case test oo-object-singleton-006 {Test singleton ensemble from conflict, should resolve to object} { ::TEST foo both } {STRAWBERRY} test oo-object-singleton-007 {Test singleton ensemble from conflict, should resolve to mixin} { ::TEST foo sloppy } {STRAWBERRY} ### # Test note: # This should work but does not ### #test oo-object-singleton-009 {Test property from mixin/class} { # ::TEST clay get property flavor #} {strawberry} test oo-object-singleton-008 {Test property from script} { ::TEST clay get property color } {green} # Test note: the behavior from TclOO is unexpected # Intuitively, a local method should override a mixin # but this is not the case test oo-object-singleton-010 {Test method declared in script} { ::TEST bar } {STRAWBERRY} test oo-object-singleton-011 {Test method declared in script} { ::TEST booze } {OBJECT} TEST destroy # OBJECT of ::foo::classa set OBJECTA [::foo::classa new] ### # Test object degation ### proc ::foo::fakeobject {a b} { |
︙ | ︙ | |||
3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 | test oo-object-clay-method-native-0001 {Test native object gets the property const//color} { $OBJECTA clay get const/ color } {blue} test oo-object-clay-method-mixin-0001 {Test mixin object gets the property const//color} { $MIXINA clay get const/ color } {blue} test oo-object-clay-method-native-0002 {Test native object gets the property const//flavor} { $OBJECTA clay get const/ flavor } {strawberry} test oo-object-clay-method-mixin-0002 {Test mixin object gets the property const//flavor} { $MIXINA clay get const/ flavor } {strawberry} test oo-object-clay-method-native-0003 {Test native object gets the property const//sound} { $OBJECTA clay get const/ sound } {zoink} test oo-object-clay-method-mixin-0003 {Test mixin object gets the property const//sound} { $MIXINA clay get const/ sound } {zoink} test oo-object-clay-method-native-0004 {Test native object gets the property info//animal} { $OBJECTA clay get info/ animal } {no} test oo-object-clay-method-mixin-0004 {Test mixin object gets the property info//animal} { $MIXINA clay get info/ animal } {no} | > > > > > > > > > > > > > > > > > > > > > > > > | 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 | test oo-object-clay-method-native-0001 {Test native object gets the property const//color} { $OBJECTA clay get const/ color } {blue} test oo-object-clay-method-mixin-0001 {Test mixin object gets the property const//color} { $MIXINA clay get const/ color } {blue} test oo-object-clay-method-native-methodcheck-0001 {Test that const//color would mimic method interheritance for a native class} { $OBJECTA color } {blue} test oo-object-clay-method-mixin-0001 {Test that const//color would mimic method interheritance for a mixed in class} { $MIXINA color } {blue} test oo-object-clay-method-native-0002 {Test native object gets the property const//flavor} { $OBJECTA clay get const/ flavor } {strawberry} test oo-object-clay-method-mixin-0002 {Test mixin object gets the property const//flavor} { $MIXINA clay get const/ flavor } {strawberry} test oo-object-clay-method-native-methodcheck-0002 {Test that const//flavor would mimic method interheritance for a native class} { $OBJECTA flavor } {strawberry} test oo-object-clay-method-mixin-0002 {Test that const//flavor would mimic method interheritance for a mixed in class} { $MIXINA flavor } {strawberry} test oo-object-clay-method-native-0003 {Test native object gets the property const//sound} { $OBJECTA clay get const/ sound } {zoink} test oo-object-clay-method-mixin-0003 {Test mixin object gets the property const//sound} { $MIXINA clay get const/ sound } {zoink} test oo-object-clay-method-native-methodcheck-0003 {Test that const//sound would mimic method interheritance for a native class} { $OBJECTA sound } {zoink} test oo-object-clay-method-mixin-0003 {Test that const//sound would mimic method interheritance for a mixed in class} { $MIXINA sound } {zoink} test oo-object-clay-method-native-0004 {Test native object gets the property info//animal} { $OBJECTA clay get info/ animal } {no} test oo-object-clay-method-mixin-0004 {Test mixin object gets the property info//animal} { $MIXINA clay get info/ animal } {no} |
︙ | ︙ | |||
3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 | test oo-object-clay-method-native-0007 {Test native object gets the property const//color} { $OBJECTB clay get const/ color } {black} test oo-object-clay-method-mixin-0007 {Test mixin object gets the property const//color} { $MIXINB clay get const/ color } {black} test oo-object-clay-method-native-0008 {Test native object gets the property const//flavor} { $OBJECTB clay get const/ flavor } {vanilla} test oo-object-clay-method-mixin-0008 {Test mixin object gets the property const//flavor} { $MIXINB clay get const/ flavor } {vanilla} test oo-object-clay-method-native-0009 {Test native object gets the property const//feeling} { $OBJECTB clay get const/ feeling } {dread} test oo-object-clay-method-mixin-0009 {Test mixin object gets the property const//feeling} { $MIXINB clay get const/ feeling } {dread} test oo-object-clay-method-native-0010 {Test native object gets the property info//subelement} { $OBJECTB clay get info/ subelement } {spoon yes} test oo-object-clay-method-mixin-0010 {Test mixin object gets the property info//subelement} { $MIXINB clay get info/ subelement } {spoon yes} | > > > > > > > > > > > > > > > > > > > > > > > > | 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 | test oo-object-clay-method-native-0007 {Test native object gets the property const//color} { $OBJECTB clay get const/ color } {black} test oo-object-clay-method-mixin-0007 {Test mixin object gets the property const//color} { $MIXINB clay get const/ color } {black} test oo-object-clay-method-native-methodcheck-0007 {Test that const//color would mimic method interheritance for a native class} { $OBJECTB color } {black} test oo-object-clay-method-mixin-0007 {Test that const//color would mimic method interheritance for a mixed in class} { $MIXINB color } {black} test oo-object-clay-method-native-0008 {Test native object gets the property const//flavor} { $OBJECTB clay get const/ flavor } {vanilla} test oo-object-clay-method-mixin-0008 {Test mixin object gets the property const//flavor} { $MIXINB clay get const/ flavor } {vanilla} test oo-object-clay-method-native-methodcheck-0008 {Test that const//flavor would mimic method interheritance for a native class} { $OBJECTB flavor } {vanilla} test oo-object-clay-method-mixin-0008 {Test that const//flavor would mimic method interheritance for a mixed in class} { $MIXINB flavor } {vanilla} test oo-object-clay-method-native-0009 {Test native object gets the property const//feeling} { $OBJECTB clay get const/ feeling } {dread} test oo-object-clay-method-mixin-0009 {Test mixin object gets the property const//feeling} { $MIXINB clay get const/ feeling } {dread} test oo-object-clay-method-native-methodcheck-0009 {Test that const//feeling would mimic method interheritance for a native class} { $OBJECTB feeling } {dread} test oo-object-clay-method-mixin-0009 {Test that const//feeling would mimic method interheritance for a mixed in class} { $MIXINB feeling } {dread} test oo-object-clay-method-native-0010 {Test native object gets the property info//subelement} { $OBJECTB clay get info/ subelement } {spoon yes} test oo-object-clay-method-mixin-0010 {Test mixin object gets the property info//subelement} { $MIXINB clay get info/ subelement } {spoon yes} |
︙ | ︙ | |||
3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 | test oo-object-clay-method-native-0011 {Test native object gets the property const//color} { $OBJECTAB clay get const/ color } {black} test oo-object-clay-method-mixin-0011 {Test mixin object gets the property const//color} { $MIXINAB clay get const/ color } {black} test oo-object-clay-method-native-0012 {Test native object gets the property const//flavor} { $OBJECTAB clay get const/ flavor } {vanilla} test oo-object-clay-method-mixin-0012 {Test mixin object gets the property const//flavor} { $MIXINAB clay get const/ flavor } {vanilla} test oo-object-clay-method-native-0013 {Test native object gets the property const//feeling} { $OBJECTAB clay get const/ feeling } {dread} test oo-object-clay-method-mixin-0013 {Test mixin object gets the property const//feeling} { $MIXINAB clay get const/ feeling } {dread} test oo-object-clay-method-native-0014 {Test native object gets the property const//sound} { $OBJECTAB clay get const/ sound } {zoink} test oo-object-clay-method-mixin-0014 {Test mixin object gets the property const//sound} { $MIXINAB clay get const/ sound } {zoink} test oo-object-clay-method-native-0015 {Test native object gets the property info//subelement} { $OBJECTAB clay get info/ subelement } {spoon yes} test oo-object-clay-method-mixin-0015 {Test mixin object gets the property info//subelement} { $MIXINAB clay get info/ subelement } {spoon yes} | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 | test oo-object-clay-method-native-0011 {Test native object gets the property const//color} { $OBJECTAB clay get const/ color } {black} test oo-object-clay-method-mixin-0011 {Test mixin object gets the property const//color} { $MIXINAB clay get const/ color } {black} test oo-object-clay-method-native-methodcheck-0011 {Test that const//color would mimic method interheritance for a native class} { $OBJECTAB color } {black} test oo-object-clay-method-mixin-0011 {Test that const//color would mimic method interheritance for a mixed in class} { $MIXINAB color } {black} test oo-object-clay-method-native-0012 {Test native object gets the property const//flavor} { $OBJECTAB clay get const/ flavor } {vanilla} test oo-object-clay-method-mixin-0012 {Test mixin object gets the property const//flavor} { $MIXINAB clay get const/ flavor } {vanilla} test oo-object-clay-method-native-methodcheck-0012 {Test that const//flavor would mimic method interheritance for a native class} { $OBJECTAB flavor } {vanilla} test oo-object-clay-method-mixin-0012 {Test that const//flavor would mimic method interheritance for a mixed in class} { $MIXINAB flavor } {vanilla} test oo-object-clay-method-native-0013 {Test native object gets the property const//feeling} { $OBJECTAB clay get const/ feeling } {dread} test oo-object-clay-method-mixin-0013 {Test mixin object gets the property const//feeling} { $MIXINAB clay get const/ feeling } {dread} test oo-object-clay-method-native-methodcheck-0013 {Test that const//feeling would mimic method interheritance for a native class} { $OBJECTAB feeling } {dread} test oo-object-clay-method-mixin-0013 {Test that const//feeling would mimic method interheritance for a mixed in class} { $MIXINAB feeling } {dread} test oo-object-clay-method-native-0014 {Test native object gets the property const//sound} { $OBJECTAB clay get const/ sound } {zoink} test oo-object-clay-method-mixin-0014 {Test mixin object gets the property const//sound} { $MIXINAB clay get const/ sound } {zoink} test oo-object-clay-method-native-methodcheck-0014 {Test that const//sound would mimic method interheritance for a native class} { $OBJECTAB sound } {zoink} test oo-object-clay-method-mixin-0014 {Test that const//sound would mimic method interheritance for a mixed in class} { $MIXINAB sound } {zoink} test oo-object-clay-method-native-0015 {Test native object gets the property info//subelement} { $OBJECTAB clay get info/ subelement } {spoon yes} test oo-object-clay-method-mixin-0015 {Test mixin object gets the property info//subelement} { $MIXINAB clay get info/ subelement } {spoon yes} |
︙ | ︙ | |||
4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 | test oo-object-clay-method-native-0018 {Test native object gets the property} { $OBJECTBA clay get const/ color } {blue} test oo-object-clay-method-mixin-0018 {Test mixin object gets the property} { $MIXINBA clay get const/ color } {blue} test oo-object-clay-method-native-0019 {Test native object gets the property} { $OBJECTBA clay get const/ flavor } {strawberry} test oo-object-clay-method-mixin-0019 {Test mixin object gets the property} { $MIXINBA clay get const/ flavor } {strawberry} test oo-object-clay-method-native-0020 {Test native object gets the property} { $OBJECTBA clay get const/ sound } {zoink} test oo-object-clay-method-mixin-0020 {Test mixin object gets the property} { $MIXINBA clay get const/ sound } {zoink} test oo-object-clay-method-native-0021 {Test native object gets the property} { $OBJECTBA clay get const/ feeling } {dread} test oo-object-clay-method-mixin-0021 {Test mixin object gets the property} { $MIXINBA clay get const/ feeling } {dread} test oo-object-clay-method-native-0022 {Test native object gets the property} { $OBJECTBA clay get info/ animal } {no} test oo-object-clay-method-mixin-0022 {Test mixin object gets the property} { $MIXINBA clay get info/ animal } {no} | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 | test oo-object-clay-method-native-0018 {Test native object gets the property} { $OBJECTBA clay get const/ color } {blue} test oo-object-clay-method-mixin-0018 {Test mixin object gets the property} { $MIXINBA clay get const/ color } {blue} test oo-object-clay-method-native-methodcheck-0018 {Test that const//color would mimic method interheritance for a native class} { $OBJECTBA color } {blue} test oo-object-clay-method-mixin-0018 {Test that const//color would mimic method interheritance for a mixed in class} { $MIXINBA color } {blue} test oo-object-clay-method-native-0019 {Test native object gets the property} { $OBJECTBA clay get const/ flavor } {strawberry} test oo-object-clay-method-mixin-0019 {Test mixin object gets the property} { $MIXINBA clay get const/ flavor } {strawberry} test oo-object-clay-method-native-methodcheck-0019 {Test that const//flavor would mimic method interheritance for a native class} { $OBJECTBA flavor } {strawberry} test oo-object-clay-method-mixin-0019 {Test that const//flavor would mimic method interheritance for a mixed in class} { $MIXINBA flavor } {strawberry} test oo-object-clay-method-native-0020 {Test native object gets the property} { $OBJECTBA clay get const/ sound } {zoink} test oo-object-clay-method-mixin-0020 {Test mixin object gets the property} { $MIXINBA clay get const/ sound } {zoink} test oo-object-clay-method-native-methodcheck-0020 {Test that const//sound would mimic method interheritance for a native class} { $OBJECTBA sound } {zoink} test oo-object-clay-method-mixin-0020 {Test that const//sound would mimic method interheritance for a mixed in class} { $MIXINBA sound } {zoink} test oo-object-clay-method-native-0021 {Test native object gets the property} { $OBJECTBA clay get const/ feeling } {dread} test oo-object-clay-method-mixin-0021 {Test mixin object gets the property} { $MIXINBA clay get const/ feeling } {dread} test oo-object-clay-method-native-methodcheck-0021 {Test that const//feeling would mimic method interheritance for a native class} { $OBJECTBA feeling } {dread} test oo-object-clay-method-mixin-0021 {Test that const//feeling would mimic method interheritance for a mixed in class} { $MIXINBA feeling } {dread} test oo-object-clay-method-native-0022 {Test native object gets the property} { $OBJECTBA clay get info/ animal } {no} test oo-object-clay-method-mixin-0022 {Test mixin object gets the property} { $MIXINBA clay get info/ animal } {no} |
︙ | ︙ | |||
4159 4160 4161 4162 4163 4164 4165 | method do args { return "I did $args" } Ensemble which::color {} { return [my clay get color] } | | | 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 | method do args { return "I did $args" } Ensemble which::color {} { return [my clay get color] } clay set method_ensemble which farbe: {tailcall my Which_color {*}$args} } ### # Test clay information is passed town to subclasses ### test clay-class-clay-0003 {Test that a clay statement is recorded in the object of the class} { ::TEST::myclasse clay get color |
︙ | ︙ | |||
4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 | $OBJ3 which color } black # Test setting properties test clay-object-method-0004 {Test an ensemble alias} { $OBJ3 which farbe } black ### # Test that if you try to replace a global command you get an error ### test clay-nspace-0001 {Test that if you try to replace a global command you get an error} -body { ::clay::define open { method bar {} { return foo } | > > > > > > > > > > > > > > > > > > > > > > | 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 | $OBJ3 which color } black # Test setting properties test clay-object-method-0004 {Test an ensemble alias} { $OBJ3 which farbe } black ### # Added 2019-06-24 # Test that grabbing a leaf does not pollute the cache ### ::clay::define ::TEST::class_with_deep_tree { clay set tree deep has depth 1 clay set tree shallow has depth 0 } $OBJ3 clay mixinmap deep ::TEST::class_with_deep_tree test clay-deep-nested-0001 {Test that a leaf query does not pollute the cache} { $OBJ3 clay get tree shallow has depth } 0 test clay-deep-nested-0001 {Test that a leaf query does not pollute the cache} { $OBJ3 clay get tree } {deep {has {depth 1}} shallow {has {depth 0}}} ### # Test that if you try to replace a global command you get an error ### test clay-nspace-0001 {Test that if you try to replace a global command you get an error} -body { ::clay::define open { method bar {} { return foo } |
︙ | ︙ | |||
4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 | } {::cluster::fubar} test clay-nspace-0003 {Test a fully qualified class ends up in the proper namespace} { info commands ::clay::pot } {::clay::pot} #set ::clay::trace 3 ### # Mixin tests ### ### # Define a core class ### | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 | } {::cluster::fubar} test clay-nspace-0003 {Test a fully qualified class ends up in the proper namespace} { info commands ::clay::pot } {::clay::pot} #set ::clay::trace 3 ### # New test - Added 2019-09-15 # Test that the "method" variable is exposed to a default method ### ::clay::define ::ensembleWithDefault { Ensemble foo::bar {} { return A } Ensemble foo::baz {} { return B } Ensemble foo::bang {} { return C } Ensemble foo::default {} { return $method } } set OBJ [::ensembleWithDefault new] test clay-ensemble-default-0001 {Test a normal ensemble method} { $OBJ foo bar } {A} test clay-ensemble-default-0002 {Test a normal ensemble method} { $OBJ foo baz } {B} test clay-ensemble-default-0003 {Test a normal ensemble method} { $OBJ foo <list> } [lsort -dictionary {bar baz bang}] test clay-ensemble-default-0004 {Test a normal ensemble method} { $OBJ foo bing } {bing} test clay-ensemble-default-0005 {Test a normal ensemble method} { $OBJ foo bong } {bong} ### # Mixin tests ### ### # Define a core class ### |
︙ | ︙ | |||
4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 | Ensemble which::flavor {} { return [my clay get flavor] } Ensemble which::color {} { return [my clay get color] } } ::clay::define ::TEST::animal { clay color unknown clay sound unknown Ensemble which::sound {} { return [my clay get sound] } Ensemble which::color {} { return [my clay get color] } } ::clay::define ::TEST::species.cat { superclass ::TEST::animal clay sound meow | > > > > > > | > > > | 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 | Ensemble which::flavor {} { return [my clay get flavor] } Ensemble which::color {} { return [my clay get color] } } ::clay::define ::TEST::animal { clay color unknown clay sound unknown Ensemble which::sound {} { return [my clay get sound] } Ensemble which::color {} { return [my clay get color] } method sound {} { return unknown } } ::clay::define ::TEST::species.cat { superclass ::TEST::animal clay sound meow method sound {} { return meow } } ::clay::define ::TEST::coloring.calico { clay color calico } ::clay::define ::TEST::condition.dark { Ensemble which::color {} { return grey } } ::clay::define ::TEST::mood.happy { Ensemble which::sound {} { return purr } method sound {} { return purr } } test clay-object-0001 {Test than an object is created when clay::define is invoked} { info commands ::TEST::mood.happy } ::TEST::mood.happy set OBJ [::TEST::thing new] |
︙ | ︙ | |||
4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 | test clay-mixin-b-0001 {Test that an ensemble is created during a mixin} { $OBJ which color } {unknown} test clay-mixin-b-0002 {Test that an ensemble is created during a mixin} { $OBJ which sound } {unknown} test clay-mixin-b-0003 {Test that an ensemble is created during a mixin} -body {$OBJ which flavor} -returnCodes {error} -result {unknown method which flavor. Valid: color sound} ### # Test Modified: 2018-10-21 ### test clay-mixin-b-0004 {Test that mixins resolve in the correct order} { $OBJ clay ancestors } {::TEST::animal ::TEST::thing ::clay::object} | > > | 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 | test clay-mixin-b-0001 {Test that an ensemble is created during a mixin} { $OBJ which color } {unknown} test clay-mixin-b-0002 {Test that an ensemble is created during a mixin} { $OBJ which sound } {unknown} test clay-mixin-b-0003 {Test that an ensemble is created during a mixin} -body {$OBJ which flavor} -returnCodes {error} -result {unknown method which flavor. Valid: color sound} ### # Test Modified: 2018-10-21 ### test clay-mixin-b-0004 {Test that mixins resolve in the correct order} { $OBJ clay ancestors } {::TEST::animal ::TEST::thing ::clay::object} |
︙ | ︙ | |||
4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 | ### # Replacing a mixin $OBJ clay mixinmap species ::TEST::species.cat test clay-mixin-e-0001 {Test that an ensemble is created during a mixin} { $OBJ which color } {unknown} test clay-mixin-e-0002 {Test that an ensemble is created during a mixin} { $OBJ which sound } {meow} test clay-mixin-e-0003 {Test that an ensemble is created during a mixin} -body {$OBJ which flavor} -returnCodes {error} -result {unknown method which flavor. Valid: color sound} ### # Test Modified: 2018-10-30, 2018-10-21, 2018-10-10 ### | > > > > > > | 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 | ### # Replacing a mixin $OBJ clay mixinmap species ::TEST::species.cat test clay-mixin-e-0001 {Test that an ensemble is created during a mixin} { $OBJ which color } {unknown} test clay-mixin-e-0002a {Test that an ensemble is created during a mixin} { $OBJ sound } {meow} test clay-mixin-e-0002b {Test that an ensemble is created during a mixin} { $OBJ clay get sound } {meow} test clay-mixin-e-0002 {Test that an ensemble is created during a mixin} { $OBJ which sound } {meow} test clay-mixin-e-0003 {Test that an ensemble is created during a mixin} -body {$OBJ which flavor} -returnCodes {error} -result {unknown method which flavor. Valid: color sound} ### # Test Modified: 2018-10-30, 2018-10-21, 2018-10-10 ### |
︙ | ︙ |
Changes to modules/clay/pkgIndex.tcl.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. if {![package vsatisfies [package provide Tcl] 8.6]} {return} | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. if {![package vsatisfies [package provide Tcl] 8.6]} {return} package ifneeded clay 0.8.6 [list source [file join $dir clay.tcl]] |
Changes to modules/devtools/testutilities.tcl.
︙ | ︙ | |||
164 165 166 167 168 169 170 171 172 173 174 175 176 177 | ## Easy definition and initialization of test constraints. proc InitializeTclTest {} { global tcltestinit if {[info exists tcltestinit] && $tcltestinit} return set tcltestinit 1 if {![package vsatisfies [package provide tcltest] 2.0]} { # Tcltest 2.0+ provides a documented public API to define and # initialize a test constraint. For earlier versions of the # package the user has to directly set a non-public undocumented # variable in the package's namespace. We create a command doing # this and emulating the public API. | > > > > > > > > | 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | ## Easy definition and initialization of test constraints. proc InitializeTclTest {} { global tcltestinit if {[info exists tcltestinit] && $tcltestinit} return set tcltestinit 1 proc ::tcltest::byConstraint {dict} { foreach {constraint value} $dict { if {![testConstraint $constraint]} continue return $value } return -code error "No result available. Failed to match any of the constraints ([join [lsort -dict [dict keys $dict]] ,])." } if {![package vsatisfies [package provide tcltest] 2.0]} { # Tcltest 2.0+ provides a documented public API to define and # initialize a test constraint. For earlier versions of the # package the user has to directly set a non-public undocumented # variable in the package's namespace. We create a command doing # this and emulating the public API. |
︙ | ︙ | |||
217 218 219 220 221 222 223 224 225 226 227 228 229 230 | ::tcltest::testConstraint tcl8.5plus \ [expr {[package vsatisfies [package provide Tcl] 8.5]}] ::tcltest::testConstraint tcl8.6plus \ [expr {[package vsatisfies [package provide Tcl] 8.6]}] ::tcltest::testConstraint tcl8.4minus \ [expr {![package vsatisfies [package provide Tcl] 8.5]}] ::tcltest::testConstraint tcl8.5minus \ [expr {![package vsatisfies [package provide Tcl] 8.6]}] # ### ### ### ######### ######### ######### | > > > > > > > | 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | ::tcltest::testConstraint tcl8.5plus \ [expr {[package vsatisfies [package provide Tcl] 8.5]}] ::tcltest::testConstraint tcl8.6plus \ [expr {[package vsatisfies [package provide Tcl] 8.6]}] ::tcltest::testConstraint tcl8.6not10 \ [expr { [package vsatisfies [package provide Tcl] 8.6] && ![package vsatisfies [package provide Tcl] 8.6.10]}] ::tcltest::testConstraint tcl8.6.10plus \ [expr {[package vsatisfies [package provide Tcl] 8.6.10]}] ::tcltest::testConstraint tcl8.4minus \ [expr {![package vsatisfies [package provide Tcl] 8.5]}] ::tcltest::testConstraint tcl8.5minus \ [expr {![package vsatisfies [package provide Tcl] 8.6]}] # ### ### ### ######### ######### ######### |
︙ | ︙ |
Changes to modules/dns/dns.tcl.
1 2 3 4 5 6 | # dns.tcl - Copyright (C) 2002 Pat Thoyts <[email protected]> # # Provide a Tcl only Domain Name Service client. See RFC 1034 and RFC 1035 # for information about the DNS protocol. This should insulate Tcl scripts # from problems with using the system library resolver for slow name servers. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # dns.tcl - Copyright (C) 2002 Pat Thoyts <[email protected]> # # Provide a Tcl only Domain Name Service client. See RFC 1034 and RFC 1035 # for information about the DNS protocol. This should insulate Tcl scripts # from problems with using the system library resolver for slow name servers. # # This implementation uses TCP only for DNS queries. The protocol recommends # that UDP be used in these cases but Tcl does not include UDP sockets by # default. The package should be simple to extend to use a TclUDP extension # in the future. # # Support for SPF (http://spf.pobox.com/rfcs.html) will need updating # if or when the proposed draft becomes accepted. # |
︙ | ︙ | |||
282 283 284 285 286 287 288 | if {[llength [package provide ceptcl]] == 0 \ && [llength [package provide udp]] == 0} { return -code error "udp support is not available,\ get ceptcl or tcludp" } } | | > > > > > > > | 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 | if {[llength [package provide ceptcl]] == 0 \ && [llength [package provide udp]] == 0} { return -code error "udp support is not available,\ get ceptcl or tcludp" } } # Check for reverse lookups. IPv4 first, then IPv6. if {[regexp {^(?:\d{0,3}\.){3}\d{0,3}$} $state(query)]} { set addr [lreverse [split $state(query) .]] lappend addr in-addr arpa set state(query) [join $addr .] set state(-type) PTR } elseif {[string match {*:*} $state(query)]} { set addr [ip::normalize $state(query)] set addr [split [string reverse $addr] :] set addr [join [split [join $addr ""] {}] .] lappend addr ip6 arpa set state(query) [join $addr .] set state(-type) PTR } BuildMessage $token if {$state(-protocol) == "tcp"} { TcpTransmit $token |
︙ | ︙ | |||
1476 1477 1478 1479 1480 1481 1482 | return "dns:$query" } # ------------------------------------------------------------------------- catch {dns::configure -nameserver [lindex [dns::nameservers] 0]} | | | 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 | return "dns:$query" } # ------------------------------------------------------------------------- catch {dns::configure -nameserver [lindex [dns::nameservers] 0]} package provide dns 1.4.1 # ------------------------------------------------------------------------- # Local Variables: # indent-tabs-mode: nil # End: |
Changes to modules/dns/dns.test.
1 2 3 4 5 6 7 8 | # dns.test - Copyright (C) 2002 Pat Thoyts <[email protected]> # # Tests for the Tcllib dns package # # ------------------------------------------------------------------------- # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # ------------------------------------------------------------------------- | < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # dns.test - Copyright (C) 2002 Pat Thoyts <[email protected]> # # Tests for the Tcllib dns package # # ------------------------------------------------------------------------- # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- source [file join \ [file dirname [file dirname [file join [pwd] [info script]]]] \ devtools testutilities.tcl] |
︙ | ︙ |
Changes to modules/dns/pkgIndex.tcl.
1 | # pkgIndex.tcl - | | < < | | 1 2 3 4 5 6 7 | # pkgIndex.tcl - if {![package vsatisfies [package provide Tcl] 8.2]} {return} package ifneeded dns 1.4.1 [list source [file join $dir dns.tcl]] package ifneeded resolv 1.0.3 [list source [file join $dir resolv.tcl]] package ifneeded ip 1.4 [list source [file join $dir ip.tcl]] package ifneeded spf 1.1.1 [list source [file join $dir spf.tcl]] |
Changes to modules/dns/tcllib_dns.man.
|
| | | 1 2 3 4 5 6 7 8 | [vset DNS_VERSION 1.4.1] [manpage_begin dns n [vset DNS_VERSION]] [see_also resolver(5)] [keywords DNS] [keywords {domain name service}] [keywords resolver] [keywords {rfc 1034}] [keywords {rfc 1035}] |
︙ | ︙ |
Changes to modules/hook/hook.test.
1 2 | # hook.test -*- tcl -*- # | | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # hook.test -*- tcl -*- # # This file contains the test suite for hook.tcl. # # Copyright (C) 2010 by Will Duquette # Copyright (c) 2019 by Andreas Kupries # # See the file "license.terms" for information on usage and # redistribution of this file, and for a DISCLAIMER OF ALL # WARRANTIES. #----------------------------------------------------------------------- |
︙ | ︙ | |||
92 93 94 95 96 97 98 | proc GetError {} { variable info return $info(errorList) } | < < < < < < | 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | proc GetError {} { variable info return $info(errorList) } #----------------------------------------------------------------------- # cget test cget-1.1 {unknown option name} -body { hook cget -nonesuch } -returnCodes { error |
︙ | ︙ | |||
436 437 438 439 440 441 442 | hook configure -errorcommand ErrorCommand hook bind S1 <H1> O1 {error "simulated error"} hook call S1 <H1> GetError } -cleanup { cleanup | | | | > > | | | > > < | 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 | hook configure -errorcommand ErrorCommand hook bind S1 <H1> O1 {error "simulated error"} hook call S1 <H1> GetError } -cleanup { cleanup } -result [tcltest::byConstraint { tcl8.6.10plus {{{S1 <H1> {} O1} {simulated error} {-code 1 -level 0 -errorstack {INNER {error {simulated error}} UP 1 CALL {::hook::call S1 <H1>}} -errorcode NONE}}} tcl8.6not10 {{{S1 <H1> {} O1} {simulated error} {-code 1 -level 0 -errorstack {INNER {error {simulated error}} UP 1 CALL {call S1 <H1>}} -errorcode NONE}}} tcl8.5minus {{{S1 <H1> {} O1} {simulated error} {-code 1 -level 0 -errorcode NONE}}} }] test errorcommand-1.3 {handled errors don't break sequence of calls} -body { hook configure -errorcommand ErrorCommand TestBind S1 <H1> O1 hook bind S1 <H1> O2 {error "simulated error"} TestBind S1 <H1> O3 hook call S1 <H1> list [GetCalls] [GetError] } -cleanup { cleanup } -result [tcltest::byConstraint { tcl8.6.10plus {{{S1 <H1> O1 {}} {S1 <H1> O3 {}}} {{{S1 <H1> {} O2} {simulated error} {-code 1 -level 0 -errorstack {INNER {error {simulated error}} UP 1 CALL {::hook::call S1 <H1>}} -errorcode NONE}}}} tcl8.6not10 {{{S1 <H1> O1 {}} {S1 <H1> O3 {}}} {{{S1 <H1> {} O2} {simulated error} {-code 1 -level 0 -errorstack {INNER {error {simulated error}} UP 1 CALL {call S1 <H1>}} -errorcode NONE}}}} tcl8.5minus {{{S1 <H1> O1 {}} {S1 <H1> O3 {}}} {{{S1 <H1> {} O2} {simulated error} {-code 1 -level 0 -errorcode NONE}}}} }] test errorcommand-1.4 {-errorcommand handles other exceptions} -body { hook configure -errorcommand ErrorCommand hook bind S1 <H1> O1 {return -code break "simulated break"} hook call S1 <H1> GetError } -cleanup { cleanup } -result {{{S1 <H1> {} O1} {simulated break} {-code 3 -level 1}}} #----------------------------------------------------------------------- # -tracecommand test tracecommand-1.1 {-tracecommand is called} -body { TestBind S1 <H1> O1 TestBind S1 <H1> O2 |
︙ | ︙ | |||
486 487 488 489 490 491 492 | cleanup } -result {{S1 <H1> {} {O1 O2}} {S2 <H2> {} O2} {S3 <H3> {} {}}} #----------------------------------------------------------------------- # Clean up and finish ::tcltest::cleanupTests | > | 484 485 486 487 488 489 490 491 | cleanup } -result {{S1 <H1> {} {O1 O2}} {S2 <H2> {} O2} {S3 <H3> {} {}}} #----------------------------------------------------------------------- # Clean up and finish ::tcltest::cleanupTests return |
Changes to modules/httpd/build/build.tcl.
1 2 3 4 5 6 7 8 9 10 11 12 | set srcdir [file dirname [file normalize [file join [pwd] [info script]]]] set moddir [file dirname $srcdir] if {[file exists [file join $moddir .. .. scripts practcl.tcl]]} { source [file join $moddir .. .. scripts practcl.tcl] } elseif {[file exists [file join $moddir .. practcl build doctool.tcl]]} { source [file join $moddir .. practcl build doctool.tcl] } else { package require practcl 0.14 } ::practcl::doctool create AutoDoc | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | set srcdir [file dirname [file normalize [file join [pwd] [info script]]]] set moddir [file dirname $srcdir] if {[file exists [file join $moddir .. .. scripts practcl.tcl]]} { source [file join $moddir .. .. scripts practcl.tcl] } elseif {[file exists [file join $moddir .. practcl build doctool.tcl]]} { source [file join $moddir .. practcl build doctool.tcl] } else { package require practcl 0.14 } ::practcl::doctool create AutoDoc set version 4.3.4 set tclversion 8.6 set module [file tail $moddir] set filename $module set fout [open [file join $moddir ${filename}.tcl] w] dict set modmap %module% $module dict set modmap %version% $version |
︙ | ︙ | |||
54 55 56 57 58 59 60 | puts $fout [::practcl::docstrip $content] puts $fout "###\n# END: [file tail $file]\n###" } # These files can be loaded in any order foreach file [glob [file join $srcdir *.tcl]] { if {[file tail $file] in $loaded} continue lappend loaded $file | < | 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | puts $fout [::practcl::docstrip $content] puts $fout "###\n# END: [file tail $file]\n###" } # These files can be loaded in any order foreach file [glob [file join $srcdir *.tcl]] { if {[file tail $file] in $loaded} continue lappend loaded $file set fin [open [file join $srcdir $file] r] puts $fout "###\n# START: [file tail $file]\n###" set content [::practcl::cat [file join $srcdir $file]] AutoDoc scan_text $content puts $fout [::practcl::docstrip $content] puts $fout "###\n# END: [file tail $file]\n###" } |
︙ | ︙ |
Added modules/httpd/build/cuneiform.tcl.
> | 1 |
Changes to modules/httpd/build/dispatch.tcl.
︙ | ︙ | |||
37 38 39 40 41 42 43 44 45 46 | ::clay::define ::httpd::content.template { method content {} { if {[my request get HTTP_STATUS] ne {}} { my reply set Status [my request get HTTP_STATUS] } my puts [subst [my <server> template [my clay get template]]] } } | > > | 37 38 39 40 41 42 43 44 45 46 47 48 | ::clay::define ::httpd::content.template { method content {} { if {[my request get HTTP_STATUS] ne {}} { my reply set Status [my request get HTTP_STATUS] } set request [my request dump] dict with request {} my puts [subst [my <server> template [my clay get template]]] } } |
Changes to modules/httpd/build/file.tcl.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ### # Class to deliver Static content # When utilized, this class is fed a local filename # by the dispatcher ### ::clay::define ::httpd::content.file { method FileName {} { # Some dispatchers will inject a fully qualified name during discovery if {[my clay exists FILENAME] && [file exists [my clay get FILENAME]]} { return [my clay get FILENAME] } set uri [string trimleft [my request get REQUEST_PATH] /] set path [my clay get path] set prefix [my clay get prefix] set fname [string range $uri [string length $prefix] end] | > | > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | ### # Class to deliver Static content # When utilized, this class is fed a local filename # by the dispatcher ### ::clay::define ::httpd::content.file { method FileName {} { # Some dispatchers will inject a fully qualified name during discovery if {[my clay exists FILENAME] && [file exists [my clay get FILENAME]]} { my request set PREFIX_URI [file dirname [my clay get FILENAME]] return [my clay get FILENAME] } set uri [string trimleft [my request get REQUEST_PATH] /] set path [my clay get path] set prefix [my clay get prefix] set fname [string range $uri [string length $prefix] end] if {$fname in "{} index.html index.md index index.tml index.tcl"} { return $path } if {[file exists [file join $path $fname]]} { return [file join $path $fname] } if {[file exists [file join $path $fname.md]]} { return [file join $path $fname.md] } if {[file exists [file join $path $fname.html]]} { return [file join $path $fname.html] } if {[file exists [file join $path $fname.tml]]} { return [file join $path $fname.tml] } if {[file exists [file join $path $fname.tcl]]} { return [file join $path $fname.tcl] } return {} } method DirectoryListing {local_file} { set uri [string trimleft [my request get REQUEST_PATH] /] set path [my clay get path] |
︙ | ︙ | |||
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | set local_file [my FileName] if {$local_file eq {} || ![file exist $local_file]} { my log httpNotFound [my request get REQUEST_PATH] my error 404 {File Not Found} tailcall my DoOutput } if {[file isdirectory $local_file] || [file tail $local_file] in {index index.html index.tml index.md}} { ### # Produce an index page ### set idxfound 0 foreach name { index.html index.tml index.md content.htm } { if {[file exists [file join $local_file $name]]} { set idxfound 1 set local_file [file join $local_file $name] break } } if {!$idxfound} { tailcall my DirectoryListing $local_file } } switch [file extension $local_file] { .md { package require Markdown my reply set Content-Type {text/html; charset=UTF-8} set mdtxt [::fileutil::cat $local_file] my puts [::Markdown::convert $mdtxt] } .tml { my reply set Content-Type {text/html; charset=UTF-8} set tmltxt [::fileutil::cat $local_file] set headers [my request dump] dict with headers {} my puts [subst $tmltxt] } | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | > > | > | | > > > > | | | | | | | | | | | | | | | | | | | | > > > > | | | > > | 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 | set local_file [my FileName] if {$local_file eq {} || ![file exist $local_file]} { my log httpNotFound [my request get REQUEST_PATH] my error 404 {File Not Found} tailcall my DoOutput } if {[file isdirectory $local_file] || [file tail $local_file] in {index index.html index.tml index.md}} { my request set PREFIX_URI [my request get REQUEST_PATH] my request set LOCAL_DIR $local_file ### # Produce an index page ### set idxfound 0 foreach name { index.tcl index.html index.tml index.md index.info index.clay content.htm } { if {[file exists [file join $local_file $name]]} { set idxfound 1 set local_file [file join $local_file $name] break } } if {!$idxfound} { tailcall my DirectoryListing $local_file } } else { my request set PREFIX_URI [file dirname [my request get REQUEST_PATH]] my request set LOCAL_DIR [file dirname $local_file] } my request set LOCAL_FILE $local_file switch [file extension $local_file] { .apng { my reply set Content-Type {image/apng} set reply_file $local_file } .bmp { my reply set Content-Type {image/bmp} set reply_file $local_file } .css { my reply set Content-Type {text/css} set reply_file $local_file } .gif { my reply set Content-Type {image/gif} set reply_file $local_file } .cur - .ico { my reply set Content-Type {image/x-icon} set reply_file $local_file } .jpg - .jpeg - .jfif - .pjpeg - .pjp { my reply set Content-Type {image/jpg} set reply_file $local_file } .js { my reply set Content-Type {text/javascript} set reply_file $local_file } .md { package require Markdown my reply set Content-Type {text/html; charset=UTF-8} set mdtxt [::fileutil::cat $local_file] my puts [::Markdown::convert $mdtxt] } .png { my reply set Content-Type {image/png} set reply_file $local_file } .svgz - .svg { # FU magic screws it up my reply set Content-Type {image/svg+xml} set reply_file $local_file } .tcl { my reply set Content-Type {text/html; charset=UTF-8} try { source $local_file } on error {err errdat} { my error 500 {Internal Error} [dict get $errdat -errorinfo] } } .tiff { my reply set Content-Type {image/tiff} set reply_file $local_file } .tml { my reply set Content-Type {text/html; charset=UTF-8} set tmltxt [::fileutil::cat $local_file] set headers [my request dump] dict with headers {} my puts [subst $tmltxt] } .txt { my reply set Content-Type {text/plain} set reply_file $local_file } .webp { my reply set Content-Type {image/webp} set reply_file $local_file } default { ### # Assume we are returning a binary file ### my reply set Content-Type [::fileutil::magic::filetype $local_file] set reply_file $local_file } } } method Dispatch {} { my variable reply_body reply_file reply_chan chan try { my reset # Invoke the URL implementation. my content } on error {err errdat} { my error 500 $err [dict get $errdat -errorinfo] catch { tailcall my DoOutput } } if {$chan eq {}} return catch { # Causing random issues. Technically a socket is always open for read and write # anyway #my wait writable $chan if {![info exists reply_file]} { tailcall my DoOutput } chan configure $chan -translation {binary binary} my log HttpAccess {} ### # Return a stream of data from a file ### set size [file size $reply_file] my reply set Content-Length $size append result [my reply output] \n chan puts -nonewline $chan $result set reply_chan [open $reply_file r] my ChannelRegister $reply_chan my log SendReply [list length $size] ### # Output the file contents. With no -size flag, channel will copy until EOF ### chan configure $reply_chan -translation {binary binary} -buffersize 4096 -buffering full -blocking 0 if {$size < 40960} { # Raw copy small files chan copy $reply_chan $chan } else { my ChannelCopy $reply_chan $chan -chunk 4096 } } } } |
Changes to modules/httpd/build/reply.tcl.
︙ | ︙ | |||
222 223 224 225 226 227 228 | if {[dict exists $datastate delegate]} { my clay delegate {*}[dict get $datastate delegate] } my reset set request [my clay get dict/ request] foreach {f v} $datastate { if {[string index $f end] eq "/"} { | | | 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 | if {[dict exists $datastate delegate]} { my clay delegate {*}[dict get $datastate delegate] } my reset set request [my clay get dict/ request] foreach {f v} $datastate { if {[string index $f end] eq "/"} { catch {my clay merge $f $v} } else { my clay set $f $v } if {$f eq "http"} { foreach {ff vf} $v { dict set request $ff $vf } |
︙ | ︙ | |||
339 340 341 342 343 344 345 | # Generates the the HTTP reply, streams that reply back across [arg chan], # and destroys the object. ### method DoOutput {} { my variable reply_body chan if {$chan eq {}} return catch { | > > | | 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 | # Generates the the HTTP reply, streams that reply back across [arg chan], # and destroys the object. ### method DoOutput {} { my variable reply_body chan if {$chan eq {}} return catch { # Causing random issues. Technically a socket is always open for read and write # anyway #my wait writable $chan chan configure $chan -translation {binary binary} ### # Return dynamic content ### set length [string length $reply_body] set result {} if {${length} > 0} { |
︙ | ︙ |
Changes to modules/httpd/httpd.man.
1 | [comment {-*- tcl -*- doctools manpage}] | | | 1 2 3 4 5 6 7 8 9 | [comment {-*- tcl -*- doctools manpage}] [vset PACKAGE_VERSION 4.3.4] [manpage_begin httpd n [vset PACKAGE_VERSION]] [keywords WWW] [copyright {2018 Sean Woods <[email protected]>}] [moddesc {Tcl Web Server}] [titledesc {A TclOO and coroutine based web server}] [category Networking] [keywords TclOO] |
︙ | ︙ |
Changes to modules/httpd/httpd.tcl.
1 2 3 4 5 6 | ### # Amalgamated package for httpd # Do not edit directly, tweak the source in src/ and rerun # build.tcl ### package require Tcl 8.6 | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ### # Amalgamated package for httpd # Do not edit directly, tweak the source in src/ and rerun # build.tcl ### package require Tcl 8.6 package provide httpd 4.3.4 namespace eval ::httpd {} set ::httpd::version 4.3.4 ### # START: core.tcl ### package require uri package require dns package require cron package require coroutine |
︙ | ︙ | |||
389 390 391 392 393 394 395 | if {[dict exists $datastate delegate]} { my clay delegate {*}[dict get $datastate delegate] } my reset set request [my clay get dict/ request] foreach {f v} $datastate { if {[string index $f end] eq "/"} { | | | 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 | if {[dict exists $datastate delegate]} { my clay delegate {*}[dict get $datastate delegate] } my reset set request [my clay get dict/ request] foreach {f v} $datastate { if {[string index $f end] eq "/"} { catch {my clay merge $f $v} } else { my clay set $f $v } if {$f eq "http"} { foreach {ff vf} $v { dict set request $ff $vf } |
︙ | ︙ | |||
483 484 485 486 487 488 489 | return ::httpd::object::[my clay get UUID] } } method DoOutput {} { my variable reply_body chan if {$chan eq {}} return catch { | > > | | 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 | return ::httpd::object::[my clay get UUID] } } method DoOutput {} { my variable reply_body chan if {$chan eq {}} return catch { # Causing random issues. Technically a socket is always open for read and write # anyway #my wait writable $chan chan configure $chan -translation {binary binary} ### # Return dynamic content ### set length [string length $reply_body] set result {} if {${length} > 0} { |
︙ | ︙ | |||
1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 | } } ::clay::define ::httpd::content.template { method content {} { if {[my request get HTTP_STATUS] ne {}} { my reply set Status [my request get HTTP_STATUS] } my puts [subst [my <server> template [my clay get template]]] } } ### # END: dispatch.tcl ### ### # START: file.tcl ### ::clay::define ::httpd::content.file { method FileName {} { # Some dispatchers will inject a fully qualified name during discovery if {[my clay exists FILENAME] && [file exists [my clay get FILENAME]]} { return [my clay get FILENAME] } set uri [string trimleft [my request get REQUEST_PATH] /] set path [my clay get path] set prefix [my clay get prefix] set fname [string range $uri [string length $prefix] end] | > > > | > > > | 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 | } } ::clay::define ::httpd::content.template { method content {} { if {[my request get HTTP_STATUS] ne {}} { my reply set Status [my request get HTTP_STATUS] } set request [my request dump] dict with request {} my puts [subst [my <server> template [my clay get template]]] } } ### # END: dispatch.tcl ### ### # START: file.tcl ### ::clay::define ::httpd::content.file { method FileName {} { # Some dispatchers will inject a fully qualified name during discovery if {[my clay exists FILENAME] && [file exists [my clay get FILENAME]]} { my request set PREFIX_URI [file dirname [my clay get FILENAME]] return [my clay get FILENAME] } set uri [string trimleft [my request get REQUEST_PATH] /] set path [my clay get path] set prefix [my clay get prefix] set fname [string range $uri [string length $prefix] end] if {$fname in "{} index.html index.md index index.tml index.tcl"} { return $path } if {[file exists [file join $path $fname]]} { return [file join $path $fname] } if {[file exists [file join $path $fname.md]]} { return [file join $path $fname.md] } if {[file exists [file join $path $fname.html]]} { return [file join $path $fname.html] } if {[file exists [file join $path $fname.tml]]} { return [file join $path $fname.tml] } if {[file exists [file join $path $fname.tcl]]} { return [file join $path $fname.tcl] } return {} } method DirectoryListing {local_file} { set uri [string trimleft [my request get REQUEST_PATH] /] set path [my clay get path] set prefix [my clay get prefix] |
︙ | ︙ | |||
1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 | set local_file [my FileName] if {$local_file eq {} || ![file exist $local_file]} { my log httpNotFound [my request get REQUEST_PATH] my error 404 {File Not Found} tailcall my DoOutput } if {[file isdirectory $local_file] || [file tail $local_file] in {index index.html index.tml index.md}} { ### # Produce an index page ### set idxfound 0 foreach name { index.html index.tml index.md content.htm } { if {[file exists [file join $local_file $name]]} { set idxfound 1 set local_file [file join $local_file $name] break } } if {!$idxfound} { tailcall my DirectoryListing $local_file } } switch [file extension $local_file] { .md { package require Markdown my reply set Content-Type {text/html; charset=UTF-8} set mdtxt [::fileutil::cat $local_file] my puts [::Markdown::convert $mdtxt] } .tml { my reply set Content-Type {text/html; charset=UTF-8} set tmltxt [::fileutil::cat $local_file] set headers [my request dump] dict with headers {} my puts [subst $tmltxt] } | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | > > | > | | > > > > | | | | | | | | | | | | | | | | | | | | > > > > | > > | 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 | set local_file [my FileName] if {$local_file eq {} || ![file exist $local_file]} { my log httpNotFound [my request get REQUEST_PATH] my error 404 {File Not Found} tailcall my DoOutput } if {[file isdirectory $local_file] || [file tail $local_file] in {index index.html index.tml index.md}} { my request set PREFIX_URI [my request get REQUEST_PATH] my request set LOCAL_DIR $local_file ### # Produce an index page ### set idxfound 0 foreach name { index.tcl index.html index.tml index.md index.info index.clay content.htm } { if {[file exists [file join $local_file $name]]} { set idxfound 1 set local_file [file join $local_file $name] break } } if {!$idxfound} { tailcall my DirectoryListing $local_file } } else { my request set PREFIX_URI [file dirname [my request get REQUEST_PATH]] my request set LOCAL_DIR [file dirname $local_file] } my request set LOCAL_FILE $local_file switch [file extension $local_file] { .apng { my reply set Content-Type {image/apng} set reply_file $local_file } .bmp { my reply set Content-Type {image/bmp} set reply_file $local_file } .css { my reply set Content-Type {text/css} set reply_file $local_file } .gif { my reply set Content-Type {image/gif} set reply_file $local_file } .cur - .ico { my reply set Content-Type {image/x-icon} set reply_file $local_file } .jpg - .jpeg - .jfif - .pjpeg - .pjp { my reply set Content-Type {image/jpg} set reply_file $local_file } .js { my reply set Content-Type {text/javascript} set reply_file $local_file } .md { package require Markdown my reply set Content-Type {text/html; charset=UTF-8} set mdtxt [::fileutil::cat $local_file] my puts [::Markdown::convert $mdtxt] } .png { my reply set Content-Type {image/png} set reply_file $local_file } .svgz - .svg { # FU magic screws it up my reply set Content-Type {image/svg+xml} set reply_file $local_file } .tcl { my reply set Content-Type {text/html; charset=UTF-8} try { source $local_file } on error {err errdat} { my error 500 {Internal Error} [dict get $errdat -errorinfo] } } .tiff { my reply set Content-Type {image/tiff} set reply_file $local_file } .tml { my reply set Content-Type {text/html; charset=UTF-8} set tmltxt [::fileutil::cat $local_file] set headers [my request dump] dict with headers {} my puts [subst $tmltxt] } .txt { my reply set Content-Type {text/plain} set reply_file $local_file } .webp { my reply set Content-Type {image/webp} set reply_file $local_file } default { ### # Assume we are returning a binary file ### my reply set Content-Type [::fileutil::magic::filetype $local_file] set reply_file $local_file } } } method Dispatch {} { my variable reply_body reply_file reply_chan chan try { my reset # Invoke the URL implementation. my content } on error {err errdat} { my error 500 $err [dict get $errdat -errorinfo] catch { tailcall my DoOutput } } if {$chan eq {}} return catch { # Causing random issues. Technically a socket is always open for read and write # anyway #my wait writable $chan if {![info exists reply_file]} { tailcall my DoOutput } chan configure $chan -translation {binary binary} my log HttpAccess {} ### # Return a stream of data from a file ### set size [file size $reply_file] my reply set Content-Length $size append result [my reply output] \n chan puts -nonewline $chan $result set reply_chan [open $reply_file r] my ChannelRegister $reply_chan my log SendReply [list length $size] ### # Output the file contents. With no -size flag, channel will copy until EOF ### chan configure $reply_chan -translation {binary binary} -buffersize 4096 -buffering full -blocking 0 if {$size < 40960} { # Raw copy small files chan copy $reply_chan $chan } else { my ChannelCopy $reply_chan $chan -chunk 4096 } } } } ### # END: file.tcl ### ### |
︙ | ︙ |
Changes to modules/httpd/pkgIndex.tcl.
1 2 | if {![package vsatisfies [package provide Tcl] 8.6]} {return} | | | 1 2 3 4 | if {![package vsatisfies [package provide Tcl] 8.6]} {return} package ifneeded httpd 4.3.4 [list source [file join $dir httpd.tcl]] |
Changes to modules/markdown/markdown.man.
|
| | | 1 2 3 4 5 6 7 8 | [vset VERSION 1.1.1] [comment {-*- tcl -*- doctools manpage}] [manpage_begin markdown n [vset VERSION]] [moddesc {Markdown to HTML Converter}] [titledesc {Converts Markdown text to HTML}] [category {Text processing}] [require Tcl 8.5] [require Markdown [vset VERSION]] |
︙ | ︙ |
Changes to modules/markdown/markdown.tcl.
︙ | ︙ | |||
249 250 251 252 253 254 255 | if {$eoc} { break } set line [lindex $lines $index] } set code_result [join $code_result \n] | | | 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 | if {$eoc} { break } set line [lindex $lines $index] } set code_result [join $code_result \n] append result <pre><code> $code_result </code></pre> } {^(?:(?:`{3,})|(?:~{3,}))\{?(\S+)?\}?\s*$} { # FENCED CODE BLOCKS set code_result {} if {[string index $line 0] eq {`}} { set end_match {^`{3,}\s*$} } else { |
︙ | ︙ | |||
804 805 806 807 808 809 810 | ## \private proc html_escape {text} { return [string map {& & < < > > \" "} $text] } } | | | | 804 805 806 807 808 809 810 811 812 | ## \private proc html_escape {text} { return [string map {& & < < > > \" "} $text] } } package provide Markdown 1.1.1 return |
Changes to modules/markdown/markdown.test.
1 2 3 4 5 6 7 | # tool.test - Copyright (c) 2016 Sean Woods, Will DuQuette, Caius Project # ------------------------------------------------------------------------- #------------------------------------------------------------------------- # TITLE: # markdown.test # # PROJECT: | > | 1 2 3 4 5 6 7 8 | # -*- tcl -*- # tool.test - Copyright (c) 2016 Sean Woods, Will DuQuette, Caius Project # ------------------------------------------------------------------------- #------------------------------------------------------------------------- # TITLE: # markdown.test # # PROJECT: |
︙ | ︙ | |||
28 29 30 31 32 33 34 | } #------------------------------------------------------------------------- # Setup tcltest::testConstraint knownbug 0 | < | | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | } #------------------------------------------------------------------------- # Setup tcltest::testConstraint knownbug 0 # outdent text # # text - A multi-line text string # # This command outdents a multi-line text string to the left margin. proc outdent {text} { # FIRST, remove any leading blank lines regsub {\A(\s*\n)} $text "" text # NEXT, remove any trailing whitespace set text [string trimright $text] # NEXT, get the length of the leader on the first line. if {[regexp {\A(\s*)\S} $text dummy leader]} { # Remove the leader from the beginning of each indented # line, and update the string. regsub -all -line "^$leader" $text "" text } |
︙ | ︙ | |||
224 225 226 227 228 229 230 | <h3>Heading 3</h3> <p>This is what he said. This is what she said. This is what he said. This is what she said.</p> <pre><code>import os | | < < < > > > > > > > > > > > > > > > | 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 | <h3>Heading 3</h3> <p>This is what he said. This is what she said. This is what he said. This is what she said.</p> <pre><code>import os os.path.listdir()</code></pre> <p>This is what he said. This is what she said. This is what he said. This is what she said.</p> </blockquote> <h2>Heading 2</h2> <p>This is what he said. This is what she said. This is what he said. This is what she said.</p> </blockquote> <p>This is a test.</p> } test convert-2.2 {refs} -body { convert { Find it [here][foo]! [foo]: http://example.com/ "Optional Title Here" } } -result { <p>Find it <a href="http://example.com/" title="Optional Title Here">here</a>!</p> } test code-block-1.0 {basic code block render} -body { convert { pre code in code post code } } -result { <p>pre code</p> <pre><code>in code</code></pre> <p>post code</p> } #========================================================================= # Tests related to other processors or test suites #------------------------------------------------------------------------- # Caius Markdown Tests # |
︙ | ︙ | |||
310 311 312 313 314 315 316 317 318 | test caius-1.7 {indent test} -body { set md [::tcltest::viewFile test/indent.md] set html [::tcltest::viewFile test/indent.html] cmp $html [Markdown::convert $md] } -result {1} } #------------------------------------------------------------------------- # mdtest: Bugs found while running michelf/mdtest | > < | 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 | test caius-1.7 {indent test} -body { set md [::tcltest::viewFile test/indent.md] set html [::tcltest::viewFile test/indent.html] cmp $html [Markdown::convert $md] } -result {1} } #------------------------------------------------------------------------- # mdtest: Bugs found while running michelf/mdtest test mdtest-1.1 {AL: Auto links: & not escaped in URL} -body { convert { Auto-link with ampersand: <http://example.com/?foo=1&bar=2> } } -result { <p>Auto-link with ampersand: <a href="http://example.com/?foo=1&bar=2">http://example.com/?foo=1&bar=2</a></p> |
︙ | ︙ |
Changes to modules/markdown/pkgIndex.tcl.
|
| | | 1 | package ifneeded Markdown 1.1.1 [list source [file join $dir markdown.tcl]] |
Changes to modules/practcl/build/build.tcl.
1 2 3 4 5 6 | set srcdir [file dirname [file normalize [file join [pwd] [info script]]]] set moddir [file dirname $srcdir] source [file join $srcdir doctool.tcl] ::practcl::doctool create AutoDoc | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | set srcdir [file dirname [file normalize [file join [pwd] [info script]]]] set moddir [file dirname $srcdir] source [file join $srcdir doctool.tcl] ::practcl::doctool create AutoDoc set version 0.16.4 set tclversion 8.6 set module [file tail $moddir] set filename $module set fout [open [file join $moddir $filename.tcl] w] fconfigure $fout -translation lf dict set modmap %module% $module |
︙ | ︙ |
Changes to modules/practcl/build/buildutil.tcl.
︙ | ︙ | |||
147 148 149 150 151 152 153 | dict set result $key [dict get $list $key] } return $result } } | | > > > > > > > > > > > > > > > > > > > > > > > > > > | 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | dict set result $key [dict get $list $key] } return $result } } ### # Returns a dictionary describing the local operating system. # Fields return include: # [list_begin itemized] # [item] download - Filesystem path where fossil repositories and source tarballs are downloaded for the current user # [item] EXEEXT - The extension to give to executables. (i.e. .exe on windows) # [item] fossil_mirror - A URI for a local network web server who acts as a fossil repository mirror # [item] local_install - Filesystem path where packages for local consumption by the current user are installed # [item] prefix - The prefix as given to the Tcl core/TEA for installation to local_install in ./configure # [item] sandbox - The file location where this project unpacks external projects # [item] TEACUP_PROFILE - The ActiveState/Teacup canonical name for this platform (i.e. win32-ix86 macosx10.5-i386-x86_84) # [item] TEACUP_OS - The local operating system (windows, macosx, openbsd, etc). Gives the same answer as tcl.m4, except that macosx is given as macosx instead of Darwin. # [item] TEA_PLATFORM - The platform returned by uname -s-uname -r (on Unix), or "windows" on Windows # [item] TEACUP_ARCH - The processor architecture for the local os (i.e. ix86, x86_64) # [item] TEACUP_ARCH - The processor architecture for the local os (i.e. ix86, x86_64) # [item] teapot - Filesystem path where teapot package files are downloaded for the current user # [item] userhome - File path to store localized preferences, cache download files, etc for the current user # [list_end] # This command uses a combination of local checks with Exec, any tclConfig.sh file that is # resident, autoconf data where already computed, and data gleaned from a file named # practcl.rc in userhome. The location for userhome varies by platform and operating system: # [list_begin itemized] # [item] Windows: ::env(LOCALAPPDATA)/Tcl # [item] Macos: ~/Library/Application Support/Tcl # [item] Other: ~/tcl # [list_end] ### proc ::practcl::local_os {} { # If we have already run this command, return # a cached copy of the data if {[info exists ::practcl::LOCAL_INFO]} { return $::practcl::LOCAL_INFO } set result [array get ::practcl::CONFIG] |
︙ | ︙ | |||
290 291 292 293 294 295 296 | set ::practcl::LOCAL_INFO $result return $result } ### | | > > > > > > > > > > > > > > > > > > > > > | 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 | set ::practcl::LOCAL_INFO $result return $result } ### # A transparent call to ::practcl::read_configuration to preserve backward compadibility # with older copies of Practcl ### proc ::practcl::config.tcl {path} { return [read_configuration $path] } ### # Detect local platform. This command looks for data gleaned by autoconf or autosetup # in the path specified, or perform its own logic tests if neither has been run. # A file named config.site present in the location indicates that this project is # cross compiling, and the data stored in that file is used for the compiler and linker. # [para] # This command looks for information from the following files, in the following order: # [list_begin itemized] # [item] config.tcl - A file generated by autoconf/configure in newer editions of TEA, encoded as a Tcl script. # [item] config.site - A file containing cross compiler information, encoded as a SH script # [item] ::env(VisualStudioVersion) - On Windows, and environmental value that indicates MS Visual Studio is installed # [list_end] # [para] # This command returns a dictionary containing all of the data cleaned from the sources above. # In the absence of any guidance this command returns the same output as ::practcl::local_os. # In this mode, if the environmental variable VisualStudioVersion exists, this command # will provide a template of fields that are appropriate for compiling on Windows under # Microsoft Visual Studio. The USEMSVC flag in the dictionary is a boolean flag to indicate # if this is indeed the case. ### proc ::practcl::read_configuration {path} { dict set result buildpath $path set result [local_os] set OS [dict get $result TEACUP_OS] set windows 0 dict set result USEMSVC 0 if {[file exists [file join $path config.tcl]]} { |
︙ | ︙ | |||
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 | } ::practcl::LOCAL tool tcllib env-load uplevel #0 [list ::package require $pkg {*}$args] } namespace eval ::practcl::platform {} proc ::practcl::platform::tcl_core_options {os} { ### # Download our required packages ### set tcl_config_opts {} # Auto-guess options for the local operating system switch $os { windows { #lappend tcl_config_opts --disable-stubs } linux { } macosx { lappend tcl_config_opts --enable-corefoundation=yes --enable-framework=no } } | > > > > > > > > | | 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 | } ::practcl::LOCAL tool tcllib env-load uplevel #0 [list ::package require $pkg {*}$args] } namespace eval ::practcl::platform {} ### # Return the string to pass to ./configure to compile the Tcl core for the given OS. # [list_begin itemized] # [item] windows: --with-tzdata --with-encoding utf-8 # [item] macosx: --enable-corefoundation=yes --enable-framework=no --with-tzdata --with-encoding utf-8 # [item] other: --with-tzdata --with-encoding utf-8 # [list_end] ### proc ::practcl::platform::tcl_core_options {os} { ### # Download our required packages ### set tcl_config_opts {} # Auto-guess options for the local operating system switch $os { windows { #lappend tcl_config_opts --disable-stubs } linux { } macosx { lappend tcl_config_opts --enable-corefoundation=yes --enable-framework=no } } lappend tcl_config_opts --with-tzdata --with-encoding utf-8 return $tcl_config_opts } proc ::practcl::platform::tk_core_options {os} { ### # Download our required packages ### |
︙ | ︙ |
Changes to modules/practcl/build/class/module.tcl.
︙ | ︙ | |||
143 144 145 146 147 148 149 | if {![dict exists $make_object $item]} { dict set make_object $item $obj } } } return $obj } | | | 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | if {![dict exists $make_object $item]} { dict set make_object $item $obj } } } return $obj } clay set method_ensemble make target aliases {target add} # Return a list of handles for object which return true for the # do method Ensemble make::todo {} { foreach {name obj} $make_object { if {[$obj do]} { lappend result $name |
︙ | ︙ |
Changes to modules/practcl/build/class/project/tclkit.tcl.
︙ | ︙ | |||
67 68 69 70 71 72 73 | set map {} foreach var { vfsroot mainhook mainfunc vfs_main } { dict set map %${var}% [set $var] } | | > < < < < < < < < < < < < < < < < < < < < < < < < < < | 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | set map {} foreach var { vfsroot mainhook mainfunc vfs_main } { dict set map %${var}% [set $var] } set thread_init_script {namespace eval ::starkit {}} append thread_init_script \n [list set ::starkit::topdir $vfsroot] set preinitscript { set ::odie(boot_vfs) %vfsroot% set ::SRCDIR $::odie(boot_vfs) namespace eval ::starkit {} set ::starkit::topdir %vfsroot% if {[file exists [file join %vfsroot% tcl_library init.tcl]]} { set ::tcl_library [file join %vfsroot% tcl_library] set ::auto_path {} } if {[file exists [file join %vfsroot% tk_library tk.tcl]]} { set ::tk_library [file join %vfsroot% tk_library] } } ; # Preinitscript set zvfsboot { /* * %mainhook% -- * Performs the argument munging for the shell */ } ::practcl::cputs zvfsboot { |
︙ | ︙ | |||
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 | return TCL_ERROR; } } if {![$PROJECT define get tip_430 0]} { ::practcl::cputs appinit { TclZipfs_Init(interp);} } foreach {statpkg info} $statpkglist { set initfunc {} if {[dict exists $info initfunc]} { set initfunc [dict get $info initfunc] } if {$initfunc eq {}} { set initfunc [string totitle ${statpkg}]_Init } if {![dict exists $info version]} { error "$statpkg HAS NO VERSION" } # We employ a NULL to prevent the package system from thinking the # package is actually loaded into the interpreter $PROJECT code header "extern Tcl_PackageInitProc $initfunc\;\n" if {[dict get $info autoload]} { ::practcl::cputs appinit " if(${initfunc}(interp)) return TCL_ERROR\;" ::practcl::cputs appinit " Tcl_StaticPackage(interp,\"$statpkg\",$initfunc,NULL)\;" } else { ::practcl::cputs appinit "\n Tcl_StaticPackage(NULL,\"$statpkg\",$initfunc,NULL)\;" } } | > > > > > > > > > > > > > > > > > > | > > > > > | | 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | return TCL_ERROR; } } if {![$PROJECT define get tip_430 0]} { ::practcl::cputs appinit { TclZipfs_Init(interp);} } set main_init_script {} foreach {statpkg info} $statpkglist { set initfunc {} if {[dict exists $info initfunc]} { set initfunc [dict get $info initfunc] } if {$initfunc eq {}} { set initfunc [string totitle ${statpkg}]_Init } if {![dict exists $info version]} { error "$statpkg HAS NO VERSION" } # We employ a NULL to prevent the package system from thinking the # package is actually loaded into the interpreter $PROJECT code header "extern Tcl_PackageInitProc $initfunc\;\n" set script [list package ifneeded $statpkg [dict get $info version] [list ::load {} $statpkg]] append main_init_script \n [list set ::starkit::static_packages(${statpkg}) $script] if {[dict get $info autoload]} { ::practcl::cputs appinit " if(${initfunc}(interp)) return TCL_ERROR\;" ::practcl::cputs appinit " Tcl_StaticPackage(interp,\"$statpkg\",$initfunc,NULL)\;" } else { ::practcl::cputs appinit "\n Tcl_StaticPackage(NULL,\"$statpkg\",$initfunc,NULL)\;" append main_init_script \n $script } } append main_init_script \n { if {[file exists [file join $::starkit::topdir pkgIndex.tcl]]} { #In a wrapped exe, we don't go out to the environment set dir $::starkit::topdir source [file join $::starkit::topdir pkgIndex.tcl] }} append thread_init_script $main_init_script append main_init_script \n { # Specify a user-specific startup file to invoke if the application # is run interactively. Typically the startup file is "~/.apprc" # where "app" is the name of the application. If this line is deleted # then no user-specific startup file will be run under any conditions. } append thread_init_script \n [list set ::starkit::thread_init $thread_init_script] append main_init_script \n [list set ::starkit::thread_init $thread_init_script] append main_init_script \n [list set tcl_rcFileName [$PROJECT define get tcl_rcFileName ~/.tclshrc]] practcl::cputs appinit " Tcl_Eval(interp,[::practcl::tcl_to_c $thread_init_script]);" practcl::cputs appinit { return TCL_OK;} $PROJECT c_function [string map $map "int %mainfunc%(Tcl_Interp *interp)"] [string map $map $appinit] } method Collate_Source CWD { next $CWD set name [my define get name] |
︙ | ︙ |
Changes to modules/practcl/build/installutil.tcl.
1 2 3 4 5 6 7 8 9 10 | proc ::practcl::_pkgindex_simpleIndex {path} { set buffer {} set pkgidxfile [file join $path pkgIndex.tcl] set modfile [file join $path [file tail $path].tcl] set use_pkgindex [file exists $pkgidxfile] set tclfiles {} set found 0 set mlist [list pkgIndex.tcl index.tcl [file tail $modfile] version_info.tcl] foreach file [glob -nocomplain [file join $path *.tcl]] { if {[file tail $file] ni $mlist} { | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | proc ::practcl::_pkgindex_simpleIndex {path} { set buffer {} set pkgidxfile [file join $path pkgIndex.tcl] set modfile [file join $path [file tail $path].tcl] set use_pkgindex [file exists $pkgidxfile] set tclfiles {} set found 0 set mlist [list pkgIndex.tcl index.tcl [file tail $modfile] version_info.tcl] foreach file [glob -nocomplain [file join $path *.tcl]] { if {[file tail $file] ni $mlist} { #puts [list NONMODFILE $file] return {} } } foreach file [glob -nocomplain [file join $path *.tcl]] { if { [file tail $file] == "version_info.tcl" } continue set fin [open $file r] set dat [read $fin] close $fin if {![regexp "package provide" $dat]} continue set fname [file rootname [file tail $file]] # Look for a package provide statement foreach line [split $dat \n] { set line [string trim $line] if { [string range $line 0 14] != "package provide" } continue set package [lindex $line 2] set version [lindex $line 3] if {[string index $package 0] in "\$ \[ @"} continue if {[string index $version 0] in "\$ \[ @"} continue #puts "PKGLINE $line" append buffer "package ifneeded $package $version \[list source \[file join %DIR% [file tail $file]\]\]" \n break } } return $buffer } |
︙ | ︙ | |||
324 325 326 327 328 329 330 331 | } set IdxTime [file mtime $pkgIndexFile] if {$latest<$IdxTime} return } ::practcl::dotclexec $buildscript } proc ::practcl::installModule {modpath DEST} { | > > > > > > > > > > > > > > > > > | > | > > < | < | 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 | } set IdxTime [file mtime $pkgIndexFile] if {$latest<$IdxTime} return } ::practcl::dotclexec $buildscript } ### # Install a module from MODPATH to the directory specified. # [emph dpath] is assumed to be the fully qualified path where module is to be placed. # Any existing files will be deleted at that path. # If the path is symlink the process will return with no error and no action. # If the module has contents in the build/ directory that are newer than the # .tcl files in the module source directory, and a build/build.tcl file exists, # the build/build.tcl file is run. # If the source directory includes a file named index.tcl, the directory is assumed # to be in the tao style of modules, and the entire directory (and all subdirectories) # are copied verbatim. # If no index.tcl file is present, all .tcl files are copied from the module source # directory, and a pkgIndex.tcl file is generated if non yet exists. # I a folder named htdocs exists in the source directory, that directory is copied # verbatim to the destination. ### proc ::practcl::installModule {modpath DEST} { if {[file exists [file join $DEST modules]]} { set dpath [file join $DEST modules [file tail $modpath]] } else { set dpath $DEST } if {[file exists $dpath] && [file type $dpath] eq "link"} return if {[file exists [file join $modpath index.tcl]]} { # IRM/Tao style modules non-amalgamated ::practcl::installDir $modpath $dpath return } buildModule $modpath set files [glob -nocomplain [file join $modpath *.tcl]] if {[llength $files]} { if {[llength $files]>1} { if {![file exists [file join $modpath pkgIndex.tcl]]} { pkg_mkIndex $modpath } } |
︙ | ︙ |
Changes to modules/practcl/pkgIndex.tcl.
1 2 | ### if {![package vsatisfies [package provide Tcl] 8.6]} {return} | | | 1 2 3 4 | ### if {![package vsatisfies [package provide Tcl] 8.6]} {return} package ifneeded practcl 0.16.4 [list source [file join $dir practcl.tcl]] |
Changes to modules/practcl/practcl.man.
1 | [comment {-*- tcl -*- doctools manpage}] | | | 1 2 3 4 5 6 7 8 9 | [comment {-*- tcl -*- doctools manpage}] [vset PACKAGE_VERSION 0.16.4] [manpage_begin practcl n [vset PACKAGE_VERSION]] [keywords practcl] [copyright {2016-2018 Sean Woods <[email protected]>}] [moddesc {The The Proper Rational API for C to Tool Command Language Module}] [titledesc {The Practcl Module}] [category {TclOO}] [require TclOO 1.0] |
︙ | ︙ | |||
109 110 111 112 113 114 115 116 117 118 | does not have [emph {lsort -stride 2}] [call proc [cmd practcl::local_os]] [call proc [cmd practcl::config.tcl] [arg path]] | > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 | does not have [emph {lsort -stride 2}] [call proc [cmd practcl::local_os]] Returns a dictionary describing the local operating system. Fields return include: [list_begin itemized] [item] download - Filesystem path where fossil repositories and source tarballs are downloaded for the current user [item] EXEEXT - The extension to give to executables. (i.e. .exe on windows) [item] fossil_mirror - A URI for a local network web server who acts as a fossil repository mirror [item] local_install - Filesystem path where packages for local consumption by the current user are installed [item] prefix - The prefix as given to the Tcl core/TEA for installation to local_install in ./configure [item] sandbox - The file location where this project unpacks external projects [item] TEACUP_PROFILE - The ActiveState/Teacup canonical name for this platform (i.e. win32-ix86 macosx10.5-i386-x86_84) [item] TEACUP_OS - The local operating system (windows, macosx, openbsd, etc). Gives the same answer as tcl.m4, except that macosx is given as macosx instead of Darwin. [item] TEA_PLATFORM - The platform returned by uname -s-uname -r (on Unix), or "windows" on Windows [item] TEACUP_ARCH - The processor architecture for the local os (i.e. ix86, x86_64) [item] TEACUP_ARCH - The processor architecture for the local os (i.e. ix86, x86_64) [item] teapot - Filesystem path where teapot package files are downloaded for the current user [item] userhome - File path to store localized preferences, cache download files, etc for the current user [list_end] This command uses a combination of local checks with Exec, any tclConfig.sh file that is resident, autoconf data where already computed, and data gleaned from a file named practcl.rc in userhome. The location for userhome varies by platform and operating system: [list_begin itemized] [item] Windows: ::env(LOCALAPPDATA)/Tcl [item] Macos: ~/Library/Application Support/Tcl [item] Other: ~/tcl [list_end] [call proc [cmd practcl::config.tcl] [arg path]] A transparent call to ::practcl::read_configuration to preserve backward compadibility with older copies of Practcl [call proc [cmd practcl::read_configuration] [arg path]] Detect local platform. This command looks for data gleaned by autoconf or autosetup in the path specified, or perform its own logic tests if neither has been run. A file named config.site present in the location indicates that this project is cross compiling, and the data stored in that file is used for the compiler and linker. [para] This command looks for information from the following files, in the following order: [list_begin itemized] [item] config.tcl - A file generated by autoconf/configure in newer editions of TEA, encoded as a Tcl script. [item] config.site - A file containing cross compiler information, encoded as a SH script [item] ::env(VisualStudioVersion) - On Windows, and environmental value that indicates MS Visual Studio is installed [list_end] [para] This command returns a dictionary containing all of the data cleaned from the sources above. In the absence of any guidance this command returns the same output as ::practcl::local_os. In this mode, if the environmental variable VisualStudioVersion exists, this command will provide a template of fields that are appropriate for compiling on Windows under Microsoft Visual Studio. The USEMSVC flag in the dictionary is a boolean flag to indicate if this is indeed the case. [call proc [cmd practcl::tcllib_require] [arg pkg] [opt "[arg args]"]] Try to load a package, and failing that retrieve tcllib [call proc [cmd practcl::platform::tcl_core_options] [arg os]] Return the string to pass to ./configure to compile the Tcl core for the given OS. [list_begin itemized] [item] windows: --with-tzdata --with-encoding utf-8 [item] macosx: --enable-corefoundation=yes --enable-framework=no --with-tzdata --with-encoding utf-8 [item] other: --with-tzdata --with-encoding utf-8 [list_end] [call proc [cmd practcl::platform::tk_core_options] [arg os]] [call proc [cmd practcl::read_rc_file] [arg filename] [opt "[arg localdat] [const ""]"]] |
︙ | ︙ | |||
256 257 258 259 260 261 262 263 264 265 266 267 268 269 | [call proc [cmd practcl::buildModule] [arg modpath]] [call proc [cmd practcl::installModule] [arg modpath] [arg DEST]] [call proc [cmd practcl::trigger] [opt "[arg args]"]] Trigger build targets, and recompute dependencies | > > > > > > > > > > > > > > > > > | 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 | [call proc [cmd practcl::buildModule] [arg modpath]] [call proc [cmd practcl::installModule] [arg modpath] [arg DEST]] Install a module from MODPATH to the directory specified. [emph dpath] is assumed to be the fully qualified path where module is to be placed. Any existing files will be deleted at that path. If the path is symlink the process will return with no error and no action. If the module has contents in the build/ directory that are newer than the .tcl files in the module source directory, and a build/build.tcl file exists, the build/build.tcl file is run. If the source directory includes a file named index.tcl, the directory is assumed to be in the tao style of modules, and the entire directory (and all subdirectories) are copied verbatim. If no index.tcl file is present, all .tcl files are copied from the module source directory, and a pkgIndex.tcl file is generated if non yet exists. I a folder named htdocs exists in the source directory, that directory is copied verbatim to the destination. [call proc [cmd practcl::trigger] [opt "[arg args]"]] Trigger build targets, and recompute dependencies |
︙ | ︙ |
Changes to modules/practcl/practcl.tcl.
1 2 3 4 5 6 | ### # Amalgamated package for practcl # Do not edit directly, tweak the source in src/ and rerun # build.tcl ### package require Tcl 8.6 | | | > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | ### # Amalgamated package for practcl # Do not edit directly, tweak the source in src/ and rerun # build.tcl ### package require Tcl 8.6 package provide practcl 0.16.4 namespace eval ::practcl {} ### # START: httpwget/wget.tcl ### ### # END: httpwget/wget.tcl ### ### # START: clay/clay.tcl ### package provide clay 0.8.6 namespace eval ::clay { } namespace eval ::clay { } set ::clay::trace 0 if {[info commands ::cron::object_destroy] eq {}} { # Provide a noop if we aren't running with the cron scheduler namespace eval ::cron {} proc ::cron::object_destroy args {} } proc ::clay::PROC {name arglist body {ninja {}}} { if {[info commands $name] ne {}} return proc $name $arglist $body eval $ninja } if {[info commands ::PROC] eq {}} { namespace eval ::clay { namespace export PROC } |
︙ | ︙ | |||
188 189 190 191 192 193 194 195 196 197 198 199 200 201 | namespace eval ::clay { namespace export K } namespace eval :: { namespace import ::clay::K } } proc ::clay::noop args {} if {[info commands ::noop] eq {}} { namespace eval ::clay { namespace export noop } namespace eval :: { namespace import ::clay::noop } } proc ::clay::path args { set result {} foreach item $args { set item [string trim $item :./] foreach subitem [split $item /] { lappend result [string trim ${subitem}]/ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 | namespace eval ::clay { namespace export K } namespace eval :: { namespace import ::clay::K } } proc ::clay::noop args {} if {[info commands ::noop] eq {}} { namespace eval ::clay { namespace export noop } namespace eval :: { namespace import ::clay::noop } } proc ::clay::cleanup {} { set count 0 if {![info exists ::clay::idle_destroy]} return set objlist $::clay::idle_destroy set ::clay::idle_destroy {} foreach obj $objlist { if {![catch {$obj destroy}]} { incr count } } return $count } proc ::clay::object_create {objname {class {}}} { #if {$::clay::trace>0} { # puts [list $objname CREATE] #} } proc ::clay::object_rename {object newname} { if {$::clay::trace>0} { puts [list $object RENAME -> $newname] } } proc ::clay::object_destroy args { if {![info exists ::clay::idle_destroy]} { set ::clay::idle_destroy {} } foreach objname $args { if {$::clay::trace>0} { puts [list $objname DESTROY] } ::cron::object_destroy $objname if {$objname in $::clay::idle_destroy} continue lappend ::clay::idle_destroy $objname } } proc ::clay::path args { set result {} foreach item $args { set item [string trim $item :./] foreach subitem [split $item /] { lappend result [string trim ${subitem}]/ |
︙ | ︙ | |||
1035 1036 1037 1038 1039 1040 1041 | } ::namespace eval ::clay::define { } proc ::clay::ensemble_methodbody {ensemble einfo} { set default standard set preamble {} set eswitch {} | < | < < < | < < < < < < < < < < | < < | | < < < | | < < < < | | | | < | < < | > | < < < < < | | | | < > > | < > | | | | < | | > | > | | | | < > > > | < | < < < < | | 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 | } ::namespace eval ::clay::define { } proc ::clay::ensemble_methodbody {ensemble einfo} { set default standard set preamble {} set eswitch {} set Ensemble [string totitle $ensemble] if {$Ensemble eq "."} continue foreach {msubmethod minfo} [lsort -dictionary -stride 2 $einfo] { if {$msubmethod eq "."} continue if {![dict exists $minfo body:]} { continue } set submethod [string trim $msubmethod :/-] if {$submethod eq "default"} { set default [dict get $minfo body:] } else { dict set eswitch $submethod [dict get $minfo body:] } if {[dict exists $submethod aliases:]} { foreach alias [dict get $minfo aliases:] { if {![dict exists $eswitch $alias]} { dict set eswitch $alias [dict get $minfo body:] } } } } set methodlist [lsort -dictionary [dict keys $eswitch]] if {![dict exists $eswitch <list>]} { dict set eswitch <list> {return $methodlist} } if {$default eq "standard"} { set default "error \"unknown method $ensemble \$method. Valid: \$methodlist\"" } dict set eswitch default $default set mbody {} append mbody \n [list set methodlist $methodlist] append mbody \n "switch -- \$method \{$eswitch\}" \n return $mbody } ::proc ::clay::define::Ensemble {rawmethod args} { if {[llength $args]==2} { lassign $args argspec body set argstyle tcl } elseif {[llength $args]==3} { lassign $args argstyle argspec body } else { error "Usage: Ensemble name ?argstyle? argspec body" } set class [current_class] #if {$::clay::trace>2} { # puts [list $class Ensemble $rawmethod $argspec $body] #} set mlist [split $rawmethod "::"] set ensemble [string trim [lindex $mlist 0] :/] set method [string trim [lindex $mlist 2] :/] if {[string index $method 0] eq "_"} { $class clay set method_ensemble $ensemble $method $body return } set realmethod [string totitle $ensemble]_${method} set realbody {} if {$argstyle eq "dictargs"} { append realbody "::dictargs::parse \{$argspec\} \$args" \n } if {[$class clay exists method_ensemble $ensemble _preamble]} { append realbody [$class clay get method_ensemble $ensemble _preamble] \n } append realbody $body if {$method eq "default"} { $class clay set method_ensemble $ensemble $method: "tailcall my $realmethod \$method {*}\$args" if {$argstyle eq "dictargs"} { oo::define $class method $realmethod [list method [list args $argspec]] $realbody } else { oo::define $class method $realmethod [list method {*}$argspec] $realbody } } else { $class clay set method_ensemble $ensemble $method: "tailcall my $realmethod {*}\$args" if {$argstyle eq "dictargs"} { oo::define $class method $realmethod [list [list args $argspec]] $realbody } else { oo::define $class method $realmethod $argspec $realbody } } if {$::clay::trace>2} { puts [list $class clay set method_ensemble/ $ensemble [string trim $method :/] ...] } } ::oo::define ::clay::class { method clay {submethod args} { my variable clay if {![info exists clay]} { set clay {} |
︙ | ︙ | |||
1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 | } branch { set path [::clay::tree::storage $args] if {![dict exists $clay {*}$path .]} { dict set clay {*}$path . {} } } cget { # Leaf searches return one data field at a time # Search in our local dict if {[llength $args]==1} { set field [string trim [lindex $args 0] -:/] if {[info exists option_canonical($field)]} { set field $option_canonical($field) | > > > > > > > > > > > > > > > > | 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 | } branch { set path [::clay::tree::storage $args] if {![dict exists $clay {*}$path .]} { dict set clay {*}$path . {} } } busy { my variable clay_busy if {[llength $args]} { set clay_busy [string is true [lindex $args 0]] set claycache {} } if {![info exists clay_busy]} { set clay_busy 0 } return $clay_busy } cache { set path [lindex $args 0] set value [lindex $args 1] dict set claycache $path $value } cget { # Leaf searches return one data field at a time # Search in our local dict if {[llength $args]==1} { set field [string trim [lindex $args 0] -:/] if {[info exists option_canonical($field)]} { set field $option_canonical($field) |
︙ | ︙ | |||
1395 1396 1397 1398 1399 1400 1401 | foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return $result } ensemble_map { | | < < | | | > > > > > > > > > > > > > > > > > > > > | | | 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 | foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return $result } ensemble_map { set path [::clay::tree::storage method_ensemble] if {[dict exists $claycache {*}$path]} { return [dict get $claycache {*}$path] } set emap {} foreach class $clayorder { if {![$class clay exists {*}$path .]} continue dict for {ensemble einfo} [$class clay dget {*}$path] { if {$ensemble eq "."} continue dict for {method body} $einfo { if {$method eq "."} continue dict set emap $ensemble $method class: $class dict set emap $ensemble $method body: $body } } } if {[dict exists $clay {*}$path]} { dict for {ensemble einfo} [dict get $clay {*}$path] { dict for {method body} $einfo { if {$method eq "."} continue dict set emap $ensemble $method class: $class dict set emap $ensemble $method body: $body } } } dict set claycache {*}$path $emap return $emap } eval { set script [lindex $args 0] set buffer {} set thisline {} foreach line [split $script \n] { append thisline $line |
︙ | ︙ | |||
1475 1476 1477 1478 1479 1480 1481 | # Search in the in our list of classes for an answer foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return $result } | < < < < < < < > > > > > | | < < < < < < < > > > > > > > > | | | > | > > | < < | > | 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 | # Search in the in our list of classes for an answer foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return $result } if {[dict exists $clay {*}$path] && ![dict exists $clay {*}$path .]} { # Path is a leaf return [dict get $clay {*}$path] } # Search in our local cache if {[my clay search $path value isleaf]} { return $value } set found 0 set branch [dict exists $clay {*}$path .] foreach class $clayorder { if {[$class clay exists {*}$path .]} { set found 1 break } if {!$branch && [$class clay exists {*}$path]} { set result [$class clay dget {*}$path] my clay cache $path $result return $result } } # Path is a branch set result [dict getnull $clay {*}$path] foreach class $clayorder { if {![$class clay exists {*}$path .]} continue ::clay::tree::dictmerge result [$class clay dget {*}$path] } #if {[dict exists $clay {*}$path .]} { # ::clay::tree::dictmerge result #} my clay cache $path $result return $result } getnull - get { set path [::clay::tree::storage $args] if {[llength $path]==0} { # Do a full dump of clay data set result {} # Search in the in our list of classes for an answer foreach class $clayorder { ::clay::tree::dictmerge result [$class clay dump] } ::clay::tree::dictmerge result $clay return [::clay::tree::sanitize $result] } if {[dict exists $clay {*}$path] && ![dict exists $clay {*}$path .]} { # Path is a leaf return [dict get $clay {*}$path] } # Search in our local cache if {[my clay search $path value isleaf]} { if {!$isleaf} { return [clay::tree::sanitize $value] } else { return $value } } set found 0 set branch [dict exists $clay {*}$path .] foreach class $clayorder { if {[$class clay exists {*}$path .]} { set found 1 break } if {!$branch && [$class clay exists {*}$path]} { set result [$class clay dget {*}$path] my clay cache $path $result return $result } } # Path is a branch set result [dict getnull $clay {*}$path] #foreach class [lreverse $clayorder] { # if {![$class clay exists {*}$path .]} continue # ::clay::tree::dictmerge result [$class clay dget {*}$path] #} foreach class $clayorder { if {![$class clay exists {*}$path .]} continue ::clay::tree::dictmerge result [$class clay dget {*}$path] } #if {[dict exists $clay {*}$path .]} { # ::clay::tree::dictmerge result [dict get $clay {*}$path] #} my clay cache $path $result return [clay::tree::sanitize $result] } leaf { # Leaf searches return one data field at a time # Search in our local dict set path [::clay::tree::storage $args] if {[dict exists $clay {*}$path .]} { return [clay::tree::sanitize [dict get $clay {*}$path]] } if {[dict exists $clay {*}$path]} { return [dict get $clay {*}$path] } # Search in our local cache if {[my clay search $path value isleaf]} { if {!$isleaf} { return [clay::tree::sanitize $value] } else { return $value } } # Search in the in our list of classes for an answer foreach class $clayorder { if {[$class clay exists {*}$path]} { set value [$class clay get {*}$path] my clay cache $path $value return $value } } } merge { foreach arg $args { ::clay::tree::dictmerge clay {*}$arg } } mixin { ### # Mix in the class ### my clay flush set prior [info object mixins [self]] set newmixin {} foreach item $args { lappend newmixin ::[string trimleft $item :] } set newmap $args foreach class $prior { |
︙ | ︙ | |||
1642 1643 1644 1645 1646 1647 1648 | puts stderr "[self] MIXIN ERROR PEEKING $class:\n[dict get $errdat -errorinfo]" } break } } } mixinmap { | < | 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 | puts stderr "[self] MIXIN ERROR PEEKING $class:\n[dict get $errdat -errorinfo]" } break } } } mixinmap { if {![dict exists $clay .mixin]} { dict set clay .mixin {} } if {[llength $args]==0} { return [dict get $clay .mixin] } elseif {[llength $args]==1} { return [dict getnull $clay .mixin [lindex $args 0]] |
︙ | ︙ | |||
1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 | if {$refcount <= 0} { ::clay::object_destroy [self] } } replace { set clay [lindex $args 0] } source { source [lindex $args 0] } set { #puts [list [self] clay SET {*}$args] | > > > > > > > > > > < | > > > > > | 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 | if {$refcount <= 0} { ::clay::object_destroy [self] } } replace { set clay [lindex $args 0] } search { set path [lindex $args 0] upvar 1 [lindex $args 1] value [lindex $args 2] isleaf set isleaf [expr {![dict exists $claycache $path .]}] if {[dict exists $claycache $path]} { set value [dict get $claycache $path] return 1 } return 0 } source { source [lindex $args 0] } set { #puts [list [self] clay SET {*}$args] ::clay::tree::dictset clay {*}$args } default { dict $submethod clay {*}$args } } } method InitializePublic {} { my variable clayorder clay claycache config option_canonical clay_busy if {[info exists clay_busy] && $clay_busy} { # Avoid repeated calls to InitializePublic if we know that someone is # going to invoke it at the end of whatever process is going on return } set claycache {} set clayorder [::clay::ancestors [info object class [self]] {*}[lreverse [info object mixins [self]]]] if {![info exists clay]} { set clay {} } if {![info exists config]} { set config {} |
︙ | ︙ | |||
1775 1776 1777 1778 1779 1780 1781 | } dict set config $field $value set setcmd [dict getnull $info set-command] if {$setcmd ne {}} { {*}[string map [list %field% [list $field] %value% [list $value] %self% [namespace which my]] $setcmd] } } | < < < < < | < < < < < < < < < < < < < < < < < < < < < < | > < < < < < < < | < < | < < < < < | < < < | | > | < < < | < | | | | < | < < < < < < | < | < < < > < < < < < < < < | | < | < < < < < < | > | | | < < | < < < > | < | | | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | > > > > | > > | < < < | > > > | > | < | < > | < < > | < < < < < > | | | > | | < | | < < < < < < < < < | | < > > > | > > | | < > > | 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 | } dict set config $field $value set setcmd [dict getnull $info set-command] if {$setcmd ne {}} { {*}[string map [list %field% [list $field] %value% [list $value] %self% [namespace which my]] $setcmd] } } foreach {ensemble einfo} [my clay ensemble_map] { #if {[dict exists $einfo _body]} continue if {$ensemble eq "."} continue set body [::clay::ensemble_methodbody $ensemble $einfo] if {$::clay::trace>2} { set rawbody $body set body {puts [list [self] <object> [self method]]} append body \n $rawbody } oo::objdefine [self] method $ensemble {{method default} args} $body } } } ::clay::object clay branch array ::clay::object clay branch mixin ::clay::object clay branch option ::clay::object clay branch dict clay ::clay::object clay set variable DestroyEvent 0 proc ::clay::singleton {name script} { if {[info commands $name] eq {}} { ::clay::object create $name } oo::objdefine $name { method SingletonProcs {} { proc class class { uplevel 1 "oo::objdefine \[self\] class $class" my clay delegate class $class } proc clay args { my clay {*}$args } proc Ensemble {rawmethod args} { if {[llength $args]==2} { lassign $args argspec body set argstyle tcl } elseif {[llength $args]==3} { lassign $args argstyle argspec body } else { error "Usage: Ensemble name ?argstyle? argspec body" } set class [uplevel 1 self] #if {$::clay::trace>2} { # puts [list $class Ensemble $rawmethod $argspec $body] #} set mlist [split $rawmethod "::"] set ensemble [string trim [lindex $mlist 0] :/] set method [string trim [lindex $mlist 2] :/] if {[string index $method 0] eq "_"} { $class clay set method_ensemble $ensemble $method $body return } set realmethod [string totitle $ensemble]_${method} set realbody {} if {$argstyle eq "dictargs"} { append realbody "::dictargs::parse \{$argspec\} \$args" \n } if {[$class clay exists method_ensemble $ensemble _preamble]} { append realbody [$class clay get method_ensemble $ensemble _preamble] \n } append realbody $body if {$method eq "default"} { $class clay set method_ensemble $ensemble $method: "tailcall my $realmethod \$method {*}\$args" if {$argstyle eq "dictargs"} { oo::objdefine $class method $realmethod [list method [list args $argspec]] $realbody } else { oo::objdefine $class method $realmethod [list method {*}$argspec] $realbody } } else { $class clay set method_ensemble $ensemble $method: "tailcall my $realmethod {*}\$args" if {$argstyle eq "dictargs"} { oo::objdefine $class method $realmethod [list [list args $argspec]] $realbody } else { oo::objdefine $class method $realmethod $argspec $realbody } } if {$::clay::trace>2} { puts [list $class clay set method_ensemble/ $ensemble [string trim $method :/] ...] } } proc method args { uplevel 1 "oo::objdefine \[self\] method {*}$args" } } method script script { my clay busy 1 my SingletonProcs eval $script my clay busy 0 my InitializePublic } } $name script $script return $name } namespace eval ::clay { namespace export * } ### # END: clay/clay.tcl |
︙ | ︙ | |||
2988 2989 2990 2991 2992 2993 2994 | } linux { } macosx { lappend tcl_config_opts --enable-corefoundation=yes --enable-framework=no } } | | | 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 | } linux { } macosx { lappend tcl_config_opts --enable-corefoundation=yes --enable-framework=no } } lappend tcl_config_opts --with-tzdata --with-encoding utf-8 return $tcl_config_opts } proc ::practcl::platform::tk_core_options {os} { ### # Download our required packages ### set tk_config_opts {} |
︙ | ︙ | |||
3451 3452 3453 3454 3455 3456 3457 | set modfile [file join $path [file tail $path].tcl] set use_pkgindex [file exists $pkgidxfile] set tclfiles {} set found 0 set mlist [list pkgIndex.tcl index.tcl [file tail $modfile] version_info.tcl] foreach file [glob -nocomplain [file join $path *.tcl]] { if {[file tail $file] ni $mlist} { | | | | 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 | set modfile [file join $path [file tail $path].tcl] set use_pkgindex [file exists $pkgidxfile] set tclfiles {} set found 0 set mlist [list pkgIndex.tcl index.tcl [file tail $modfile] version_info.tcl] foreach file [glob -nocomplain [file join $path *.tcl]] { if {[file tail $file] ni $mlist} { #puts [list NONMODFILE $file] return {} } } foreach file [glob -nocomplain [file join $path *.tcl]] { if { [file tail $file] == "version_info.tcl" } continue set fin [open $file r] set dat [read $fin] close $fin if {![regexp "package provide" $dat]} continue set fname [file rootname [file tail $file]] # Look for a package provide statement foreach line [split $dat \n] { set line [string trim $line] if { [string range $line 0 14] != "package provide" } continue set package [lindex $line 2] set version [lindex $line 3] if {[string index $package 0] in "\$ \[ @"} continue if {[string index $version 0] in "\$ \[ @"} continue #puts "PKGLINE $line" append buffer "package ifneeded $package $version \[list source \[file join %DIR% [file tail $file]\]\]" \n break } } return $buffer } proc ::practcl::_pkgindex_directory {path} { |
︙ | ︙ | |||
3750 3751 3752 3753 3754 3755 3756 | } set IdxTime [file mtime $pkgIndexFile] if {$latest<$IdxTime} return } ::practcl::dotclexec $buildscript } proc ::practcl::installModule {modpath DEST} { | > | > | > > < | < | 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 | } set IdxTime [file mtime $pkgIndexFile] if {$latest<$IdxTime} return } ::practcl::dotclexec $buildscript } proc ::practcl::installModule {modpath DEST} { if {[file exists [file join $DEST modules]]} { set dpath [file join $DEST modules [file tail $modpath]] } else { set dpath $DEST } if {[file exists $dpath] && [file type $dpath] eq "link"} return if {[file exists [file join $modpath index.tcl]]} { # IRM/Tao style modules non-amalgamated ::practcl::installDir $modpath $dpath return } buildModule $modpath set files [glob -nocomplain [file join $modpath *.tcl]] if {[llength $files]} { if {[llength $files]>1} { if {![file exists [file join $modpath pkgIndex.tcl]]} { pkg_mkIndex $modpath } } |
︙ | ︙ | |||
6455 6456 6457 6458 6459 6460 6461 | if {![dict exists $make_object $item]} { dict set make_object $item $obj } } } return $obj } | | | 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 | if {![dict exists $make_object $item]} { dict set make_object $item $obj } } } return $obj } clay set method_ensemble make target aliases {target add} Ensemble make::todo {} { foreach {name obj} $make_object { if {[$obj do]} { lappend result $name } } return $result |
︙ | ︙ | |||
7253 7254 7255 7256 7257 7258 7259 | set map {} foreach var { vfsroot mainhook mainfunc vfs_main } { dict set map %${var}% [set $var] } | | > < < < < < < < < < < < < < < < < < < < < < < < < < < < | 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 | set map {} foreach var { vfsroot mainhook mainfunc vfs_main } { dict set map %${var}% [set $var] } set thread_init_script {namespace eval ::starkit {}} append thread_init_script \n [list set ::starkit::topdir $vfsroot] set preinitscript { set ::odie(boot_vfs) %vfsroot% set ::SRCDIR $::odie(boot_vfs) namespace eval ::starkit {} set ::starkit::topdir %vfsroot% if {[file exists [file join %vfsroot% tcl_library init.tcl]]} { set ::tcl_library [file join %vfsroot% tcl_library] set ::auto_path {} } if {[file exists [file join %vfsroot% tk_library tk.tcl]]} { set ::tk_library [file join %vfsroot% tk_library] } } ; # Preinitscript set zvfsboot { /* * %mainhook% -- * Performs the argument munging for the shell */ } ::practcl::cputs zvfsboot { |
︙ | ︙ | |||
7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 | return TCL_ERROR; } } if {![$PROJECT define get tip_430 0]} { ::practcl::cputs appinit { TclZipfs_Init(interp);} } foreach {statpkg info} $statpkglist { set initfunc {} if {[dict exists $info initfunc]} { set initfunc [dict get $info initfunc] } if {$initfunc eq {}} { set initfunc [string totitle ${statpkg}]_Init } if {![dict exists $info version]} { error "$statpkg HAS NO VERSION" } # We employ a NULL to prevent the package system from thinking the # package is actually loaded into the interpreter $PROJECT code header "extern Tcl_PackageInitProc $initfunc\;\n" if {[dict get $info autoload]} { ::practcl::cputs appinit " if(${initfunc}(interp)) return TCL_ERROR\;" ::practcl::cputs appinit " Tcl_StaticPackage(interp,\"$statpkg\",$initfunc,NULL)\;" } else { ::practcl::cputs appinit "\n Tcl_StaticPackage(NULL,\"$statpkg\",$initfunc,NULL)\;" } } | > > > > > > > > > > > > > > > > > > | > > > > > | | 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 | return TCL_ERROR; } } if {![$PROJECT define get tip_430 0]} { ::practcl::cputs appinit { TclZipfs_Init(interp);} } set main_init_script {} foreach {statpkg info} $statpkglist { set initfunc {} if {[dict exists $info initfunc]} { set initfunc [dict get $info initfunc] } if {$initfunc eq {}} { set initfunc [string totitle ${statpkg}]_Init } if {![dict exists $info version]} { error "$statpkg HAS NO VERSION" } # We employ a NULL to prevent the package system from thinking the # package is actually loaded into the interpreter $PROJECT code header "extern Tcl_PackageInitProc $initfunc\;\n" set script [list package ifneeded $statpkg [dict get $info version] [list ::load {} $statpkg]] append main_init_script \n [list set ::starkit::static_packages(${statpkg}) $script] if {[dict get $info autoload]} { ::practcl::cputs appinit " if(${initfunc}(interp)) return TCL_ERROR\;" ::practcl::cputs appinit " Tcl_StaticPackage(interp,\"$statpkg\",$initfunc,NULL)\;" } else { ::practcl::cputs appinit "\n Tcl_StaticPackage(NULL,\"$statpkg\",$initfunc,NULL)\;" append main_init_script \n $script } } append main_init_script \n { if {[file exists [file join $::starkit::topdir pkgIndex.tcl]]} { #In a wrapped exe, we don't go out to the environment set dir $::starkit::topdir source [file join $::starkit::topdir pkgIndex.tcl] }} append thread_init_script $main_init_script append main_init_script \n { # Specify a user-specific startup file to invoke if the application # is run interactively. Typically the startup file is "~/.apprc" # where "app" is the name of the application. If this line is deleted # then no user-specific startup file will be run under any conditions. } append thread_init_script \n [list set ::starkit::thread_init $thread_init_script] append main_init_script \n [list set ::starkit::thread_init $thread_init_script] append main_init_script \n [list set tcl_rcFileName [$PROJECT define get tcl_rcFileName ~/.tclshrc]] practcl::cputs appinit " Tcl_Eval(interp,[::practcl::tcl_to_c $thread_init_script]);" practcl::cputs appinit { return TCL_OK;} $PROJECT c_function [string map $map "int %mainfunc%(Tcl_Interp *interp)"] [string map $map $appinit] } method Collate_Source CWD { next $CWD set name [my define get name] # Assume a static shell |
︙ | ︙ |
Changes to modules/profiler/profiler.man.
|
| | | 1 2 3 4 5 6 7 8 | [vset VERSION 0.5] [comment {-*- tcl -*- doctools manpage}] [manpage_begin profiler n [vset VERSION]] [keywords performance] [keywords profile] [keywords speed] [moddesc {Tcl Profiler}] [titledesc {Tcl source code profiler}] |
︙ | ︙ | |||
99 100 101 102 103 104 105 106 107 108 109 110 111 112 | [call [cmd ::profiler::resume] [opt [arg pattern]]] Resume profiling for all functions matching [arg pattern]. If no pattern is specified, profiling will be resumed for all functions. This command should be invoked after suspending the profiler in the code. [call [cmd ::profiler::sortFunctions] [arg key]] Return a list of functions sorted by a particular profiling statistic. Supported values for [arg key] are: [const calls], [const exclusiveTime], [const compileTime], [const nonCompileTime], [const totalRuntime], [const avgExclusiveTime], and | > > > > > > > > > > > > > > | 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | [call [cmd ::profiler::resume] [opt [arg pattern]]] Resume profiling for all functions matching [arg pattern]. If no pattern is specified, profiling will be resumed for all functions. This command should be invoked after suspending the profiler in the code. [call [cmd ::profiler::new-disabled]] Change the initial profiling state for new procedures. Invoking this command disables profiling for all procedures created after this command until [cmd new-enabled] is invoked. Activate profiling of specific procedures via [cmd resume]. [call [cmd ::profiler::new-enabled]] Change the initial profiling state for new procedures. Invoking this command enables profiling for all procedures created after this command until [cmd new-disabled] is invoked. Prevent profiling of specific procedures via [cmd suspend]. [call [cmd ::profiler::sortFunctions] [arg key]] Return a list of functions sorted by a particular profiling statistic. Supported values for [arg key] are: [const calls], [const exclusiveTime], [const compileTime], [const nonCompileTime], [const totalRuntime], [const avgExclusiveTime], and |
︙ | ︙ |
Changes to modules/profiler/profiler.tcl.
1 2 3 4 5 6 7 8 9 10 | # profiler.tcl -- # # Tcl code profiler. # # Copyright (c) 1998-2000 by Ajuba Solutions. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. package require Tcl 8.3 ;# uses [clock clicks -milliseconds] | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # profiler.tcl -- # # Tcl code profiler. # # Copyright (c) 1998-2000 by Ajuba Solutions. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. package require Tcl 8.3 ;# uses [clock clicks -milliseconds] package provide profiler 0.5 namespace eval ::profiler {} # ::profiler::tZero -- # # Start a named timer instance # |
︙ | ︙ | |||
396 397 398 399 400 401 402 | # pattern pattern of the proc's to get info for; default is *. # # Results: # A human readable printout of info. proc ::profiler::print {{pattern *}} { variable callCount | > | | 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 | # pattern pattern of the proc's to get info for; default is *. # # Results: # A human readable printout of info. proc ::profiler::print {{pattern *}} { variable callCount #parray callCount set result "" foreach name [lsort [array names callCount $pattern]] { append result [printname $name] } return $result } |
︙ | ︙ | |||
600 601 602 603 604 605 606 | # Results: # None. Resets the `enabled($name)' variable to 0 # to suspend profiling proc ::profiler::suspend {{pattern *}} { variable callCount variable enabled | < < | 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 | # Results: # None. Resets the `enabled($name)' variable to 0 # to suspend profiling proc ::profiler::suspend {{pattern *}} { variable callCount variable enabled foreach name [array names callCount $pattern] { set enabled($name) 0 } return } |
︙ | ︙ | |||
624 625 626 627 628 629 630 | # Results: # None. Sets the `enabled($name)' variable to 1 # so as to enable the profiler. proc ::profiler::resume {{pattern *}} { variable callCount variable enabled | < < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 | # Results: # None. Sets the `enabled($name)' variable to 1 # so as to enable the profiler. proc ::profiler::resume {{pattern *}} { variable callCount variable enabled foreach name [array names callCount $pattern] { set enabled($name) 1 } return } # ::profiler::new-disabled -- # # Start new procedures with profiling disabled # # Arguments: # None. # # Results: # None. proc ::profiler::new-disabled {} { variable paused 1 return } # ::profiler::new-enabled -- # # Start new procedures with profiling enabled # # Arguments: # None. # # Results: # None. proc ::profiler::new-enabled {} { variable paused 0 return } |
Changes to modules/profiler/profiler.test.
︙ | ︙ | |||
185 186 187 188 189 190 191 192 193 194 195 196 197 198 | profiler::resume set res }] regsub {Compile time:.*} $result {} result string trim $result } [tcltest::viewFile [asset 5.1]] test profiler-6.1 {profiler handles functions with funny names} { array set bar [do { proc ::foo(bar) {} { set foobar 0 } foo(bar); foo(bar); foo(bar) profiler::dump ::foo(bar) | > > > > > > > > > > > > > > > > > > > > > > > > > > > | 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 | profiler::resume set res }] regsub {Compile time:.*} $result {} result string trim $result } [tcltest::viewFile [asset 5.1]] test profiler-5.2 {profiler respects new-disabled/enabled} { set result [do { profiler::new-disabled proc ::bar {} { set foobar 0 } profiler::new-enabled proc ::foo {} { set foobar 0 } #--- foo bar profiler::resume bar #--- set res [profiler::print ::foo] regsub {Compile time:.*} $res {} res set res [string trim $res] append res \n\n [profiler::print ::bar] regsub {Compile time:.*} $res {} res set res }] string trim $result } [tcltest::viewFile [asset 5.2]] test profiler-6.1 {profiler handles functions with funny names} { array set bar [do { proc ::foo(bar) {} { set foobar 0 } foo(bar); foo(bar); foo(bar) profiler::dump ::foo(bar) |
︙ | ︙ |
Added modules/profiler/test-assets/5.2.
> > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 | Profiling information for ::foo ============================================================ Total calls: 1 Caller distribution: GLOBAL: 1 Profiling information for ::bar ============================================================ Total calls: 1 Caller distribution: GLOBAL: 1 |
Changes to modules/string/token_shell.test.
1 2 3 | # -*- tcl -*- # Testsuite string::token::shell # | | < < < < < < | | | > > | | | > > | | | > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | # -*- tcl -*- # Testsuite string::token::shell # # Copyright (c) 2013,2019 by Andreas Kupries <[email protected]> # All rights reserved. # ------------------------------------------------------------------------- source [file join \ [file dirname [file dirname [file join [pwd] [info script]]]] \ devtools testutilities.tcl] testsNeedTcl 8.5 testsNeedTcltest 2.0 support { use fileutil/fileutil.tcl fileutil useLocal token.tcl string::token } testing { useLocal token_shell.tcl string::token::shell } # ------------------------------------------------------------------------- test string-token-shell-1.0 "string token shell, wrong#args, not enough" -body { string token shell } -returnCodes error -result [tcltest::byConstraint { tcl8.6.10plus {wrong # args: should be "::string::token::shell ?-indices? ?-partial? ?--? text"} tcl8.6not10 {wrong # args: should be "shell ?-indices? ?-partial? ?--? text"} tcl8.5minus {wrong # args: should be "::string::token::shell ?-indices? ?-partial? ?--? text"} }] test string-token-shell-1.1 "string token shell, wrong#args, too many" -body { string token shell T X } -returnCodes error -result [tcltest::byConstraint { tcl8.6.10plus {wrong # args: should be "::string::token::shell ?-indices? ?-partial? ?--? text"} tcl8.6not10 {wrong # args: should be "shell ?-indices? ?-partial? ?--? text"} tcl8.5minus {wrong # args: should be "::string::token::shell ?-indices? ?-partial? ?--? text"} }] test string-token-shell-1.2 "string token shell, bad option" -body { string token shell -foo T } -returnCodes error -result {Bad option -foo, expected one of -indices, or -partial} test string-token-shell-1.3 "string token shell, wrong#args, too many" -body { string token shell -- T X } -returnCodes error -result [tcltest::byConstraint { tcl8.6.10plus {wrong # args: should be "::string::token::shell ?-indices? ?-partial? ?--? text"} tcl8.6not10 {wrong # args: should be "shell ?-indices? ?-partial? ?--? text"} tcl8.5minus {wrong # args: should be "::string::token::shell ?-indices? ?-partial? ?--? text"} }] # ------------------------------------------------------------------------- foreach {n label line tokens} { 0 empty {} {} 1 leading-whitespace { } {} 2 plain-words {a} {a} |
︙ | ︙ |
Changes to modules/struct/matrix.man.
1 | [comment {-*- tcl -*-}] | > | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [vset VERSION 2.0.4] [comment {-*- tcl -*-}] [manpage_begin struct::matrix n [vset VERSION]] [keywords matrix] [copyright {2002-2013,2019 Andreas Kupries <[email protected]>}] [moddesc {Tcl Data Structures}] [titledesc {Create and manipulate matrix objects}] [category {Data structures}] [require Tcl 8.2] [require struct::matrix [opt [vset VERSION]]] [description] [para] A matrix is a rectangular collection of cells, i.e. organized in rows and columns. Each cell contains exactly one value of arbitrary form. The cells in the matrix are addressed by pairs of integer numbers, with the first (left) number in the pair specifying the |
︙ | ︙ |
Changes to modules/struct/matrix.tcl.
1 2 3 4 | # matrix.tcl -- # # Implementation of a matrix data structure for Tcl. # | | < < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # matrix.tcl -- # # Implementation of a matrix data structure for Tcl. # # Copyright (c) 2001-2013,2019 by Andreas Kupries <[email protected]> # # Heapsort code Copyright (c) 2003 by Edwin A. Suominen <[email protected]>, # based on concepts in "Introduction to Algorithms" by Thomas H. Cormen et al. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. package require Tcl 8.2 namespace eval ::struct {} namespace eval ::struct::matrix { # Data storage in the matrix module |
︙ | ︙ | |||
1243 1244 1245 1246 1247 1248 1249 | # Results: # None. proc ::struct::matrix::__format_2chan {name {report {}} {chan stdout}} { if {$report == {}} { # Use an internal hardwired simple report to format the matrix. # We delegate this to the string formatter and print its result. | | | 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 | # Results: # None. proc ::struct::matrix::__format_2chan {name {report {}} {chan stdout}} { if {$report == {}} { # Use an internal hardwired simple report to format the matrix. # We delegate this to the string formatter and print its result. puts -nonewline $chan [__format_2string $name] } else { $report printmatrix2channel $name $chan } return } # ::struct::matrix::__get_cell -- |
︙ | ︙ | |||
2785 2786 2787 2788 2789 2790 2791 | ## Ready namespace eval ::struct { # Get 'matrix::matrix' into the general structure namespace. namespace import -force matrix::matrix namespace export matrix } | | | 2783 2784 2785 2786 2787 2788 2789 2790 | ## Ready namespace eval ::struct { # Get 'matrix::matrix' into the general structure namespace. namespace import -force matrix::matrix namespace export matrix } package provide struct::matrix 2.0.4 |
Changes to modules/struct/matrix.test.
1 2 3 4 5 6 7 | # -*- tcl -*- # matrix.test: tests for the matrix structure. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # | | < < | | > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | # -*- tcl -*- # matrix.test: tests for the matrix structure. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 2001, 2019 by Andreas Kupries <[email protected]> # All rights reserved. # ------------------------------------------------------------------------- source [file join \ [file dirname [file dirname [file join [pwd] [info script]]]] \ devtools testutilities.tcl] testsNeedTcl 8.5 testsNeedTcltest 2.0 testsNeed TclOO 1 support { # memchan allows proper testing of `format 2chan` method. # Note, somebody may have imported these already. if {![llength [info commands ::tcl::chan::core]]} { use virtchannel_core/core.tcl tcl::chan::core } if {![llength [info commands ::tcl::chan::events]]} { use virtchannel_core/events.tcl tcl::chan::events } if {![llength [info commands ::tcl::chan::memchan]]} { use virtchannel_base/memchan.tcl tcl::chan::memchan } useLocalFile matrix.testsupport } testing { useLocal matrix.tcl struct::matrix } # ------------------------------------------------------------------------- |
︙ | ︙ | |||
608 609 610 611 612 613 614 | test matrix-5.0 {format error} { matrix mymatrix catch {mymatrix format} msg mymatrix destroy set msg } {wrong # args: should be "::mymatrix format option ?arg arg ...?"} | | | 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 | test matrix-5.0 {format error} { matrix mymatrix catch {mymatrix format} msg mymatrix destroy set msg } {wrong # args: should be "::mymatrix format option ?arg arg ...?"} test matrix-5.1 {formatting, 2 string, by report} { matrix mymatrix mymatrix add column mymatrix add row {1} mymatrix add column {2} mymatrix add row {3 4} mymatrix add column {5 6} mymatrix add row {7 8 9} |
︙ | ︙ | |||
651 652 653 654 655 656 657 | mymatrix add column {5 6} mymatrix add row [list 7 8 "9\nb"] set result [mymatrix format 2string] mymatrix destroy set result } "1 2 5\n3a 4 6\n7 8 9\n b" | > > > > > > > > | > > > | > > > > > > > > > > | > > > > > > > > > > > > > > | | | | | | | | | | | | | | | | | < < | < | 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 | mymatrix add column {5 6} mymatrix add row [list 7 8 "9\nb"] set result [mymatrix format 2string] mymatrix destroy set result } "1 2 5\n3a 4 6\n7 8 9\n b" test matrix-5.4 {formatting 2 channel, by report} { matrix mymatrix mymatrix add column mymatrix add row {1} mymatrix add column {2} mymatrix add row {3 4} mymatrix add column {5 6} mymatrix add row {7 8 9} set chan [tcl::chan::memchan] mymatrix format 2chan tclformat $chan mymatrix destroy seek $chan 0 set result [read $chan] close $chan set result } "# ::mymatrix 3 x 3 matrix ::mymatrix ::mymatrix add rows 3 ::mymatrix add columns 3 ::mymatrix set rect 0 0 {{1 2 5} {3 4 6} {7 8 9}} " test matrix-5.5 {formatting, 2 string, no report} { matrix mymatrix mymatrix add column mymatrix add row {1} mymatrix add column {2} mymatrix add row {3 4} mymatrix add column {5 6} mymatrix add row {7 8 9} set result [mymatrix format 2string] mymatrix destroy set result } "1 2 5 3 4 6 7 8 9" test matrix-5.6 {formatting 2 channel, no report} { matrix mymatrix mymatrix add column mymatrix add row {1} mymatrix add column {2} mymatrix add row {3 4} mymatrix add column {5 6} mymatrix add row {7 8 9} set chan [tcl::chan::memchan] mymatrix format 2chan {} $chan mymatrix destroy seek $chan 0 set result [read $chan] close $chan set result } "1 2 5 3 4 6 7 8 9" test matrix-6.0 {set/get error} { matrix mymatrix catch {mymatrix set} msga catch {mymatrix get} msgb mymatrix destroy list $msga $msgb |
︙ | ︙ |
Changes to modules/struct/matrix1.man.
1 | [comment {-*- tcl -*-}] | > | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [vset VERSION 1.2.2] [comment {-*- tcl -*-}] [manpage_begin {struct::matrix_v1} n [vset VERSION]] [keywords matrix] [copyright {2002,2019 Andreas Kupries <[email protected]>}] [moddesc {Tcl Data Structures}] [titledesc {Create and manipulate matrix objects}] [category {Data structures}] [require Tcl 8.2] [require struct::matrix [opt [vset VERSION]]] [description] [para] The [cmd ::struct::matrix] command creates a new matrix object with an associated global Tcl command whose name is [arg matrixName]. This command may be used to invoke various operations on the matrix. It has the following general form: |
︙ | ︙ |
Changes to modules/struct/matrix1.tcl.
1 2 3 4 | # matrix.tcl -- # # Implementation of a matrix data structure for Tcl. # | | < < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # matrix.tcl -- # # Implementation of a matrix data structure for Tcl. # # Copyright (c) 2001,2019 by Andreas Kupries <[email protected]> # # Heapsort code Copyright (c) 2003 by Edwin A. Suominen <[email protected]>, # based on concepts in "Introduction to Algorithms" by Thomas H. Cormen et al. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. package require Tcl 8.2 namespace eval ::struct {} namespace eval ::struct::matrix { # Data storage in the matrix module |
︙ | ︙ | |||
1034 1035 1036 1037 1038 1039 1040 | # Results: # None. proc ::struct::matrix::__format_2chan {name {report {}} {chan stdout}} { if {$report == {}} { # Use an internal hardwired simple report to format the matrix. # We delegate this to the string formatter and print its result. | | | 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 | # Results: # None. proc ::struct::matrix::__format_2chan {name {report {}} {chan stdout}} { if {$report == {}} { # Use an internal hardwired simple report to format the matrix. # We delegate this to the string formatter and print its result. puts -nonewline $chan [__format_2string $name] } else { $report printmatrix2channel $name $chan } return } # ::struct::matrix::__get_cell -- |
︙ | ︙ | |||
2280 2281 2282 2283 2284 2285 2286 | ## Ready namespace eval ::struct { # Get 'matrix::matrix' into the general structure namespace. namespace import -force matrix::matrix namespace export matrix } | | | 2278 2279 2280 2281 2282 2283 2284 2285 | ## Ready namespace eval ::struct { # Get 'matrix::matrix' into the general structure namespace. namespace import -force matrix::matrix namespace export matrix } package provide struct::matrix 1.2.2 |
Changes to modules/struct/matrix1.test.
1 2 3 4 5 6 7 8 9 | # -*- tcl -*- # matrix.test: tests for the matrix structure. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 2001 by Andreas Kupries <[email protected]> # All rights reserved. | < < | | > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | # -*- tcl -*- # matrix.test: tests for the matrix structure. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 2001 by Andreas Kupries <[email protected]> # All rights reserved. # ------------------------------------------------------------------------- source [file join \ [file dirname [file dirname [file join [pwd] [info script]]]] \ devtools testutilities.tcl] testsNeedTcl 8.5 testsNeedTcltest 2.0 testsNeed TclOO 1 support { # memchan allows proper testing of `format 2chan` method. # Note, matrix.test may have imported these already. if {![llength [info commands ::tcl::chan::core]]} { use virtchannel_core/core.tcl tcl::chan::core } if {![llength [info commands ::tcl::chan::events]]} { use virtchannel_core/events.tcl tcl::chan::events } if {![llength [info commands ::tcl::chan::memchan]]} { use virtchannel_base/memchan.tcl tcl::chan::memchan } useLocalFile matrix.testsupport } testing { useLocal matrix1.tcl struct::matrix } # ------------------------------------------------------------------------- |
︙ | ︙ | |||
548 549 550 551 552 553 554 | mymatrix add column {5 6} mymatrix add row [list 7 8 "9\nb"] set result [mymatrix format 2string] mymatrix destroy set result } "1 2 5\n3a 4 6\n7 8 9\n b" | < < < < | | | | | | | | | | | | | | | | | | | | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 | mymatrix add column {5 6} mymatrix add row [list 7 8 "9\nb"] set result [mymatrix format 2string] mymatrix destroy set result } "1 2 5\n3a 4 6\n7 8 9\n b" test matrix1-5.4 {formatting} { matrix mymatrix mymatrix add column mymatrix add row {1} mymatrix add column {2} mymatrix add row {3 4} mymatrix add column {5 6} mymatrix add row {7 8 9} set chan [tcl::chan::memchan] mymatrix format 2chan tclformat $chan mymatrix destroy seek $chan 0 set result [read $chan] close $chan set result } "# ::mymatrix 3 x 3 matrix ::mymatrix ::mymatrix add rows 3 ::mymatrix add columns 3 ::mymatrix set rect 0 0 {{1 2 5} {3 4 6} {7 8 9}} " test matrix-5.5 {formatting, 2 string, no report} { matrix mymatrix mymatrix add column mymatrix add row {1} mymatrix add column {2} mymatrix add row {3 4} mymatrix add column {5 6} mymatrix add row {7 8 9} set result [mymatrix format 2string] mymatrix destroy set result } "1 2 5 3 4 6 7 8 9" test matrix-5.6 {formatting 2 channel, no report} { matrix mymatrix mymatrix add column mymatrix add row {1} mymatrix add column {2} mymatrix add row {3 4} mymatrix add column {5 6} mymatrix add row {7 8 9} set chan [tcl::chan::memchan] mymatrix format 2chan {} $chan mymatrix destroy seek $chan 0 set result [read $chan] close $chan set result } "1 2 5 3 4 6 7 8 9" test matrix1-6.0 {set/get error} { matrix mymatrix catch {mymatrix set} msga catch {mymatrix get} msgb mymatrix destroy list $msga $msgb |
︙ | ︙ |
Changes to modules/struct/pkgIndex.tcl.
1 2 3 4 5 6 7 | if {![package vsatisfies [package provide Tcl] 8.2]} {return} package ifneeded struct 2.1 [list source [file join $dir struct.tcl]] package ifneeded struct 1.4 [list source [file join $dir struct1.tcl]] package ifneeded struct::queue 1.4.5 [list source [file join $dir queue.tcl]] package ifneeded struct::stack 1.5.3 [list source [file join $dir stack.tcl]] package ifneeded struct::tree 2.1.2 [list source [file join $dir tree.tcl]] | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | if {![package vsatisfies [package provide Tcl] 8.2]} {return} package ifneeded struct 2.1 [list source [file join $dir struct.tcl]] package ifneeded struct 1.4 [list source [file join $dir struct1.tcl]] package ifneeded struct::queue 1.4.5 [list source [file join $dir queue.tcl]] package ifneeded struct::stack 1.5.3 [list source [file join $dir stack.tcl]] package ifneeded struct::tree 2.1.2 [list source [file join $dir tree.tcl]] package ifneeded struct::matrix 2.0.4 [list source [file join $dir matrix.tcl]] package ifneeded struct::pool 1.2.3 [list source [file join $dir pool.tcl]] package ifneeded struct::record 1.2.2 [list source [file join $dir record.tcl]] package ifneeded struct::set 2.2.3 [list source [file join $dir sets.tcl]] package ifneeded struct::prioqueue 1.4 [list source [file join $dir prioqueue.tcl]] package ifneeded struct::skiplist 1.3 [list source [file join $dir skiplist.tcl]] package ifneeded struct::graph 1.2.1 [list source [file join $dir graph1.tcl]] package ifneeded struct::tree 1.2.2 [list source [file join $dir tree1.tcl]] package ifneeded struct::matrix 1.2.2 [list source [file join $dir matrix1.tcl]] if {![package vsatisfies [package provide Tcl] 8.4]} {return} package ifneeded struct::list 1.8.4 [list source [file join $dir list.tcl]] package ifneeded struct::graph 2.4.3 [list source [file join $dir graph.tcl]] package ifneeded struct::map 1 [list source [file join $dir map.tcl]] if {![package vsatisfies [package provide Tcl] 8.5]} {return} |
︙ | ︙ |
Changes to modules/virtchannel_base/fifo2.tcl.
︙ | ︙ | |||
70 71 72 73 74 75 76 | } method closeda {c} { set a {} if {$b ne {}} { close $b set b {} | | | > | | > | 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | } method closeda {c} { set a {} if {$b ne {}} { close $b set b {} } else { my destroy } return } method closedb {c} { set b {} if {$a ne {}} { close $a set a {} } else { my destroy } return } method froma {c bytes} { $hb put $bytes return } |
︙ | ︙ |
Added modules/virtchannel_base/fifo2.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | # ------------------------------------------------------------------------- # fifo2.test -*- tcl -*- # (C) 2019 Andreas Kupries. BSD licensed. # ------------------------------------------------------------------------- source [file join \ [file dirname [file dirname [file join [pwd] [info script]]]] \ devtools testutilities.tcl] testsNeedTcl 8.5 testsNeedTcltest 2.0 testsNeed TclOO 1 support { use virtchannel_core/core.tcl tcl::chan::core use virtchannel_core/events.tcl tcl::chan::events } testing { useLocal halfpipe.tcl tcl::chan::halfpipe useLocal fifo2.tcl tcl::chan::fifo2 } # ------------------------------------------------------------------------- test tcl-chan-fifo2-1.1 {constructor wrong\#args} -body { tcl::chan::fifo2 X } -returnCodes error \ -result {wrong # args: should be "tcl::chan::fifo2"} test tcl-chan-fifo2-1.2 {destructor kills both sides and coordinator} -setup { lassign [tcl::chan::fifo2] a b } -match glob -body { lappend r [lsort -dict [file channels]] lappend r [info class instances ::tcl::chan::fifo2::implementation] close $a lappend r [lsort -dict [file channels]] lappend r [info class instances ::tcl::chan::fifo2::implementation] } -cleanup { unset a b r } -result {{rc4 rc5 stderr stdin stdout} ::oo::Obj* {stderr stdin stdout} {}} # ------------------------------------------------------------------------- test tcl-chan-fifo2-2.0 {tell, initial, empty} -setup { lassign [tcl::chan::fifo2] a b } -body { list [tell $a] [tell $b] } -cleanup { close $a unset a b } -result {-1 -1} # ------------------------------------------------------------------------- test tcl-chan-fifo2-tkt-3f48fd6ea2 {fixed misindexing} -setup { lassign [tcl::chan::fifo2] a b chan configure $a -buffersize 1 chan configure $b -buffering none chan puts -nonewline $b foobar ;# push 6 chars chan read $a 2 ;# read 2 chan read $a 4 ;# read 4, fifo has nothing left chan puts -nonewline $b baz ;# push 3 more } -body { chan read $a 1 ;# read 1, the `b` } -cleanup { close $a unset a b } -result b # ------------------------------------------------------------------------- # Explicit cleanup of loaded (support) classes. rename tcl::chan::events {} rename tcl::chan::core {} rename tcl::chan::halfpipe {} rename tcl::chan::fifo2 {} testsuiteCleanup return # Local Variables: # mode: tcl # indent-tabs-mode: nil # End: |
Changes to modules/virtchannel_base/halfpipe.man.
1 | [comment {-*- tcl -*- doctools manpage}] | > | | | < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [vset VERSION 1.0.1] [comment {-*- tcl -*- doctools manpage}] [manpage_begin tcl::chan::halfpipe n [vset VERSION]] [keywords callbacks] [keywords fifo] [keywords {in-memory channel}] [keywords {reflected channel}] [keywords {tip 219}] [keywords {virtual channel}] [copyright {2009, 2019 Andreas Kupries <[email protected]>}] [moddesc {Reflected/virtual channel support}] [category Channels] [titledesc {In-memory channel, half of a fifo2}] [require Tcl 8.5] [require TclOO] [require tcl::chan::events [opt 1]] [require tcl::chan::halfpipe [opt [vset VERSION]]] [description] [para] The [package tcl::chan::halfpipe] package provides a command creating one half of a [package tcl::chan::fifo2] pair. Writing into such a channel invokes a set of callbacks which then handle the data. This is similar to a channel handler, except having a much simpler API. |
︙ | ︙ |
Changes to modules/virtchannel_base/halfpipe.tcl.
1 2 | # -*- tcl -*- # # ## ### ##### ######## ############# | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # -*- tcl -*- # # ## ### ##### ######## ############# # (C) 2009, 2019 Andreas Kupries # @@ Meta Begin # Package tcl::chan::halfpipe 1 # Meta as::author {Andreas Kupries} # Meta as::copyright 2009,2019 # Meta as::license BSD # Meta description Implementation of one half of a pipe # Meta description channel. Based on Tcl 8.5's channel # Meta description reflection support. Exports a single # Meta description command for the creation of new # Meta description channels. Option arguments. Result is the # Meta description handle of the new channel, and the object |
︙ | ︙ | |||
47 48 49 50 51 52 53 | next $c } method read {c n} { set max [string length $read] set last [expr {$at + $n - 1}] set result {} | | | | > | | | 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | next $c } method read {c n} { set max [string length $read] set last [expr {$at + $n - 1}] set result {} # last+1 <= max # <=> at+n <= max # <=> n <= max-at if {$n <= ($max - $at)} { # The request is less than what we have left in the read # buffer, we take it, and move the read pointer forward. append result [string range $read $at $last] incr at $n incr $size -$n } else { # We need the whole remaining read buffer, and more. For # the latter we make the write buffer the new read buffer, # and then read from it again. append result [string range $read $at end] incr n -[string length $result] set at 0 set last [expr {$n - 1}] set read $write set write {} set size [string length $read] set max $size # at == 0 simplifies expressions if {$n <= $max} { # The request is less than what we have in the new # read buffer, we take it, and move the read pointer # forward. append result [string range $read 0 $last] set at $n incr $size -$n } else { |
︙ | ︙ | |||
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | my Readable return $n } # # ## ### ##### ######## ############# variable at read write size options # # ## ### ##### ######## ############# constructor {args} { array set options { -write-command {} -empty-command {} -close-command {} | > > > > > > > > > > > > > > > > > > > > > | 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | my Readable return $n } # # ## ### ##### ######## ############# variable at read write size options # at : first location in read buffer not yet read # read : read buffer # write : buffer for received data, i.e. # written into the halfpipe from # the other side. # size : combined length of receive and read buffers # == amount of stored data # options : configuration array # The halpipe uses a pointer (`at`) into the data buffer to # extract the characters read by the user, while not shifting the # data down in memory. Doing such a shift would cause a large # performance hit (O(n**2) operation vs O(n)). This however comes # with the danger of the buffer growing out of bounds as ever more # data is appended by the receiver while the reader is not # catching up, preventing a release. The solution to this in turn # is to split the buffer into two. An append-only receive buffer # (`write`) for incoming data, and a `read` buffer with the # pointer. When the current read buffer is entirely consumed the # current receive buffer becomes the new read buffer and a new # empty receive buffer is started. # # ## ### ##### ######## ############# constructor {args} { array set options { -write-command {} -empty-command {} -close-command {} |
︙ | ︙ | |||
160 161 162 163 164 165 166 | if {![llength $options($o)]} return uplevel \#0 [list {*}$options($o) {*}$args] return } } # # ## ### ##### ######## ############# | | | 182 183 184 185 186 187 188 189 190 | if {![llength $options($o)]} return uplevel \#0 [list {*}$options($o) {*}$args] return } } # # ## ### ##### ######## ############# package provide tcl::chan::halfpipe 1.0.1 return |
Changes to modules/virtchannel_base/pkgIndex.tcl.
1 2 3 4 5 6 | if {![package vsatisfies [package provide Tcl] 8.5]} {return} package ifneeded tcl::chan::cat 1.0.3 [list source [file join $dir cat.tcl]] package ifneeded tcl::chan::facade 1.0.1 [list source [file join $dir facade.tcl]] package ifneeded tcl::chan::fifo 1 [list source [file join $dir fifo.tcl]] package ifneeded tcl::chan::fifo2 1 [list source [file join $dir fifo2.tcl]] | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | if {![package vsatisfies [package provide Tcl] 8.5]} {return} package ifneeded tcl::chan::cat 1.0.3 [list source [file join $dir cat.tcl]] package ifneeded tcl::chan::facade 1.0.1 [list source [file join $dir facade.tcl]] package ifneeded tcl::chan::fifo 1 [list source [file join $dir fifo.tcl]] package ifneeded tcl::chan::fifo2 1 [list source [file join $dir fifo2.tcl]] package ifneeded tcl::chan::halfpipe 1.0.1 [list source [file join $dir halfpipe.tcl]] package ifneeded tcl::chan::memchan 1.0.4 [list source [file join $dir memchan.tcl]] package ifneeded tcl::chan::null 1 [list source [file join $dir null.tcl]] package ifneeded tcl::chan::nullzero 1 [list source [file join $dir nullzero.tcl]] package ifneeded tcl::chan::random 1 [list source [file join $dir random.tcl]] package ifneeded tcl::chan::std 1.0.1 [list source [file join $dir std.tcl]] package ifneeded tcl::chan::string 1.0.3 [list source [file join $dir string.tcl]] package ifneeded tcl::chan::textwindow 1 [list source [file join $dir textwindow.tcl]] |
︙ | ︙ |
Changes to support/devel/all.tcl.
︙ | ︙ | |||
192 193 194 195 196 197 198 | set ::auto_path [pSet ::auto_path] namespace import ::tcltest::* set ::tcltest::testSingleFile false set ::tcltest::testsDirectory [pSet ::tcltest::testsDirectory] # configure not present in tcltest 1.x | | > > > | | 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | set ::auto_path [pSet ::auto_path] namespace import ::tcltest::* set ::tcltest::testSingleFile false set ::tcltest::testsDirectory [pSet ::tcltest::testsDirectory] # configure not present in tcltest 1.x if {[catch {::tcltest::configure -verbose { body skip start error pass usec line }}]} { # ^ body skip start error pass usec line set ::tcltest::verbose psb ;# pass skip body } } interp alias \ $c ::tcltest::cleanupTestsHook \ {} ::tcltest::cleanupTestsHook $c |
︙ | ︙ |
Changes to support/devel/sak/test/run.tcl.
︙ | ︙ | |||
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | # ### proc ::sak::test::run::Do {cv modules} { upvar 1 $cv config variable valgrind variable araw $config(raw) variable alog $config(log) # alog => !araw set shells $config(shells) if {![llength $shells]} { catch {set shells [sak::test::shell::list]} } if {![llength $shells]} { set shells [list [info nameofexecutable]] } if {$alog} { variable logext [open $config(stem).log w] variable logsum [open $config(stem).summary w] variable logfai [open $config(stem).failures w] variable logski [open $config(stem).skipped w] variable lognon [open $config(stem).none w] variable logerd [open $config(stem).errdetails w] variable logfad [open $config(stem).faildetails w] variable logtim [open $config(stem).timings w] variable logtmt [open $config(stem).timetable w] } else { variable logext stdout } # Preprocessing of module names and shell versions to allows # better formatting of the progress output, i.e. vertically # aligned columns | > > > > > | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | # ### proc ::sak::test::run::Do {cv modules} { upvar 1 $cv config variable valgrind variable araw $config(raw) variable alog $config(log) variable xttimes {} # alog => !araw set shells $config(shells) if {![llength $shells]} { catch {set shells [sak::test::shell::list]} } if {![llength $shells]} { set shells [list [info nameofexecutable]] } if {$alog} { variable logext [open $config(stem).log w] variable logsum [open $config(stem).summary w] variable logfai [open $config(stem).failures w] variable logski [open $config(stem).skipped w] variable lognon [open $config(stem).none w] variable logerd [open $config(stem).errdetails w] variable logfad [open $config(stem).faildetails w] # Timings per testsuite (sec), average test timings (usec) variable logtim [open $config(stem).timings w] variable logtmt [open $config(stem).timetable w] # Timings per test (usec) variable logtti [open $config(stem).t-timings w] variable logtmi [open $config(stem).t-timetable w] } else { variable logext stdout } # Preprocessing of module names and shell versions to allows # better formatting of the progress output, i.e. vertically # aligned columns |
︙ | ︙ | |||
155 156 157 158 159 160 161 162 163 | } if {$err} { puts $logext "#Errors [mag][format %6d $err][rst]" } else { puts $logext "#Errors [format %6d $err]" } if {$alog} { variable xtimes | > > > > > > > > < | > > | > | | > > > > > > > > > > > > | | > > > > > > | | | > > > | 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 | } if {$err} { puts $logext "#Errors [mag][format %6d $err][rst]" } else { puts $logext "#Errors [format %6d $err]" } flush $logext =| "... Done" if {$alog} { # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Timings per testsuite =| "... Postprocessing per-testsuite timings ..." variable xtimes struct::matrix M M add columns 6 M add row {Shell Module Testsuite Tests Seconds uSec/Test} M add row {===== ====== ========= ===== ======= =========} foreach item [lsort -decreasing -int -index 3 [lsort -dict -index 0 $xtimes]] { foreach {k testnum delta score} $item break M add row [linsert $k end $testnum $delta $score] } M add row {===== ====== ========= ===== ======= =========} puts $logtmt "\nTiming Table..." puts $logtmt [M format 2string] # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Timings per testcase. =| "... Postprocessing per-test timings ..." variable xttimes struct::matrix MX MX add columns 5 MX add row {Shell Module Testsuite Test uSec} MX add row {===== ====== ========= ==== ====} foreach item [lsort -index 1 -integer -decreasing [lsort -index 0 -dict $xttimes]] { foreach {k usec} $item break MX add row [linsert $k end $usec] } MX add row {===== ====== ========= ==== ====} puts $logtmi "\nTiming Table..." puts $logtmi [MX format 2string] # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ =| "... Postprocessing Done" } exit [expr {($err || $fail) ? 1 : 0}] return } # ### |
︙ | ︙ | |||
289 290 291 292 293 294 295 296 297 298 299 300 301 302 | CaptureFailureCollectActual ; # xcollect 3 => 4 CaptureFailureCollectExpected ; # xcollect 4 => 0 CaptureFailureCollectError ; # xcollect 5 => 0 CaptureStackStart CaptureStack TestStart TestSkipped TestPassed TestFailed ; # xcollect => 1 SetupError Aborted AbortCause | > | 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 | CaptureFailureCollectActual ; # xcollect 3 => 4 CaptureFailureCollectExpected ; # xcollect 4 => 0 CaptureFailureCollectError ; # xcollect 5 => 0 CaptureStackStart CaptureStack TestStart TestTook TestSkipped TestPassed TestFailed ; # xcollect => 1 SetupError Aborted AbortCause |
︙ | ︙ | |||
403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 | proc ::sak::test::run::EndFile {} { upvar 1 line line if {![regexp "^@@ EndFile (.*)$" $line -> end]} return variable xfile variable xstartfile variable xtimes variable xtestnum set k [lreplace $xfile 0 3] set k [lreplace $k 2 2 [file tail [lindex $k 2]]] set delta [expr {$end - $xstartfile}] if {$xtestnum == 0} { set score $delta } else { # average number of microseconds per test. set score [expr {int(($delta/double($xtestnum))*1000000)}] #set score [expr {$delta/double($xtestnum)}] } | > > | > | 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 | proc ::sak::test::run::EndFile {} { upvar 1 line line if {![regexp "^@@ EndFile (.*)$" $line -> end]} return variable xfile variable xstartfile variable xtimes variable xtestnum variable xduration set k [lreplace $xfile 0 3] set k [lreplace $k 2 2 [file tail [lindex $k 2]]] set delta [expr {$end - $xstartfile}] incr xduration $delta if {$xtestnum == 0} { set score $delta } else { # average number of microseconds per test. set score [expr {int(($delta/double($xtestnum))*1000000)}] #set score [expr {$delta/double($xtestnum)}] } lappend xtimes [list $k $xtestnum $delta $score] variable alog if {$alog} { variable logtim puts $logtim [linsert [linsert $k end $xtestnum $delta $score] 0 TIME] } #sak::registry::local set $xshell End $end return -code continue } proc ::sak::test::run::Module {} { upvar 1 line line ; variable xmodule if {![regexp "^@@ Module (.*)$" $line -> xmodule]} return variable xshell variable xstatus ok variable maxml variable xduration 0 += ${xmodule}[blank [expr {$maxml - [string length $xmodule]}]] set xmodule [linsert $xshell end $xmodule] #sak::registry::local set $xmodule return -code continue } proc ::sak::test::run::Testsuite {} { |
︙ | ︙ | |||
490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 | proc ::sak::test::run::Summary {} { upvar 1 line line if {![regexp "^all\\.tcl:(.*)$" $line -> line]} return variable xmodule variable xstatus variable xvstatus foreach {_ t _ p _ s _ f} [split [string trim $line]] break #sak::registry::local set $xmodule Total $t ; set t [format %5d $t] #sak::registry::local set $xmodule Passed $p ; set p [format %5d $p] #sak::registry::local set $xmodule Skipped $s ; set s [format %5d $s] #sak::registry::local set $xmodule Failed $f ; set f [format %5d $f] upvar 2 total _total ; incr _total $t upvar 2 pass _pass ; incr _pass $p upvar 2 skip _skip ; incr _skip $s upvar 2 fail _fail ; incr _fail $f upvar 2 err _err set t [format %5d $t] set p [format %5d $p] set s [format %5d $s] set f [format %5d $f] if {$xstatus == "ok" && $t == 0} { set xstatus none } set st $xvstatus($xstatus) if {$xstatus == "ok"} { # Quick return for ok suite. | > > > > > > > > > > > > | | | | < | < < | > > > > > > > > > > > > > | 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 | proc ::sak::test::run::Summary {} { upvar 1 line line if {![regexp "^all\\.tcl:(.*)$" $line -> line]} return variable xmodule variable xstatus variable xvstatus foreach {_ t _ p _ s _ f} [split [string trim $line]] break #sak::registry::local set $xmodule Total $t ; set t [format %5d $t] #sak::registry::local set $xmodule Passed $p ; set p [format %5d $p] #sak::registry::local set $xmodule Skipped $s ; set s [format %5d $s] #sak::registry::local set $xmodule Failed $f ; set f [format %5d $f] upvar 2 total _total ; incr _total $t upvar 2 pass _pass ; incr _pass $p upvar 2 skip _skip ; incr _skip $s upvar 2 fail _fail ; incr _fail $f upvar 2 err _err set t [format %5d $t] set p [format %5d $p] set s [format %5d $s] set f [format %5d $f] if {$xstatus == "ok" && $t == 0} { set xstatus none set spent "" } else { # Time spent on all the files in the module. variable xduration #set sec $xduration #set min [expr {$sec / 60}] #set sec [expr {$sec % 60}] #set hor [expr {$min / 60}] #set min [expr {$min % 60}] #set spent " :[format %02d $hor]h[format %02d $min]m[format %02d $sec]s" set spent " @${xduration}s" } set st $xvstatus($xstatus) if {$xstatus == "ok"} { # Quick return for ok suite. =| "~~ $st T $t P $p S $s F $f$spent" return -code continue } # Clean out progress display using a non-highlighted # string. Prevents the char count from being off. This is # followed by construction and display of the highlighted version. = " $st T $t P $p S $s F $f$spent" switch -exact -- $xstatus { none {=| "~~ [yel]$st T $t[rst] P $p S $s F $f"} aborted {=| "~~ [whi]$st[rst] T $t P $p S $s F $f$spent"} error {=| "~~ [mag]$st[rst] T $t P $p S $s F $f$spent" ; incr _err } fail {=| "~~ [red]$st[rst] T $t P $p S $s [red]F $f[rst]$spent"} } return -code continue } proc ::sak::test::run::TestStart {} { upvar 1 line line if {![string match {---- * start} $line]} return set testname [string range $line 5 end-6] = "---- $testname" variable xfile variable xtesttime -1 variable xtest [linsert $xfile end $testname] variable xtestnum incr xtestnum return -code continue } proc ::sak::test::run::TestTook {} { upvar 1 line line if {![string match {++++ * took *} $line]} return # Dynamic search for the marker because the name of the test may # contain spaces, causing the field position to vary. set pos [lsearch -exact $line took] incr pos set usec [lindex $line $pos] variable xtesttime $usec return -code continue } proc ::sak::test::run::TestSkipped {} { upvar 1 line line if {![string match {++++ * SKIPPED:*} $line]} return regexp {^[^ ]* (.*)SKIPPED:.*$} $line -> testname set testname [string trim $testname] variable xtest |
︙ | ︙ | |||
568 569 570 571 572 573 574 575 | return -code continue } proc ::sak::test::run::TestPassed {} { upvar 1 line line if {![string match {++++ * PASSED} $line]} return set testname [string range $line 5 end-7] variable xtest | > > | > > > > > > > > > > > | 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 | return -code continue } proc ::sak::test::run::TestPassed {} { upvar 1 line line if {![string match {++++ * PASSED} $line]} return set testname [string range $line 5 end-7] variable xtesttime variable xtest if {$xtesttime < 0} { set xtesttime "" } = [string trimright "PASS $testname $xtesttime"] if {$xtest == {}} { variable xfile set xtest [linsert $xfile end $testname] } #sak::registry::local set $xtest Status Pass variable alog if {$alog && ($xtesttime ne {})} { variable xttimes variable logtti set k [lreplace $xtest 0 3] set k [lreplace $k 2 2 [file tail [lindex $k 2]]] # k = shell module testfile testname puts $logtti [linsert [linsert $k 0 TIME] end $xtesttime] lappend xttimes [list $k $xtesttime] } set xtest {} return -code continue } proc ::sak::test::run::TestFailed {} { upvar 1 line line if {![string match {==== * FAILED} $line]} return |
︙ | ︙ |
Changes to support/releases/history/README-1.20.md.
1 2 3 4 5 6 | Overview ======== |||||| |---|---|---|---|---| |8|new packages|in|7|modules| | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | Overview ======== |||||| |---|---|---|---|---| |8|new packages|in|7|modules| |47|changed packages|in|30|modules| |389|unchanged packages|in|115|modules| |446|packages, total|in|131|modules, total| Legend ====== |Change|Details|Comments| |---|---|---| |Major|API|__incompatible__ API changes| |Minor|EF|Extended functionality, API| ||I|Major rewrite, but no API change| |Patch|B|Bug fixes| ||EX|New examples| ||P|Performance enhancement| |None|T|Testsuite changes| ||D|Documentation updates| New in Tcllib 1.20 ================== |Module|Package|Version|Comments| |---|---|---|---| |clay|clay|0.8.6|| |fileutil|fileutil::paths|1|Replaces: `doctools::paths`, (pt) `paths`.| |lazyset|lazyset|1|| ||||| |math|math::quasirandom|1.0|| ||math::trig|1.0|| ||||| |practcl|practcl|0.16.3|| |struct|struct::map|1|Replaces: `doctools::config`, (pt) `configuration`.| |textutil|textutil::patch|0.1|| ||textutil::wcswidth|35.1|| ||||| Deprecations in Tcllib 1.20 =========================== |
︙ | ︙ | |||
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | Changes from Tcllib 1.19 to 1.20 ================================ |Module|Package|From 1.19|To 1.20|Comments| |---|---|---|---|---| |cache|cache::async|0.3|0.3.1|B, D, T| |||||| |doctools|doctools|1.4.21|1.5.6|B| ||doctools::idx|1.0.7|1.1|EF, D, T| ||doctools::toc|1.1.6|1.2|EF, B, D, T| |||||| |doctools2idx|doctools::idx::export|0.2|0.2.1|I, D, T| ||doctools::idx::import|0.2|0.2.1|I, D, T| |||||| |doctools2toc|doctools::toc::export|0.2|0.2.1|I, D, T| ||doctools::toc::import|0.2|0.2.1|I, D, T| |||||| |dtplite|dtplite|1.3|1.3.1|B, D| |html|html|1.4.4|1.4.5|EF, B, D, T| |http|autoproxy __(1)__|1.6|1.7|EF, B, D, T| | > > | > > | > > > > | | | 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | Changes from Tcllib 1.19 to 1.20 ================================ |Module|Package|From 1.19|To 1.20|Comments| |---|---|---|---|---| |blowfish|blowfish|1.0.4|1.0.5|B, D, T| |cache|cache::async|0.3|0.3.1|B, D, T| |dns|dns|1.4|1.4.1|B, D, T| |||||| |doctools|doctools|1.4.21|1.5.6|B| ||doctools::idx|1.0.7|1.1|EF, D, T| ||doctools::toc|1.1.6|1.2|EF, B, D, T| |||||| |doctools2idx|doctools::idx::export|0.2|0.2.1|I, D, T| ||doctools::idx::import|0.2|0.2.1|I, D, T| |||||| |doctools2toc|doctools::toc::export|0.2|0.2.1|I, D, T| ||doctools::toc::import|0.2|0.2.1|I, D, T| |||||| |dtplite|dtplite|1.3|1.3.1|B, D| |html|html|1.4.4|1.4.5|EF, B, D, T| |http|autoproxy __(1)__|1.6|1.7|EF, B, D, T| |httpd|httpd|4.1.0|4.3.4|I, B, D, T| |||||| |log|log|1.3|1.4|EF, D, T| ||logger::utils|1.3|1.3.1|B, D, T| |||||| |markdown|Markdown|1.1|1.1.1|B, T| |||||| |math|math::calculus|0.8.2|0.8.2|D| ||math::interpolate|1.1.1|1.1.2|B| ||math::special __(1)__|0.3|0.4|EF, D, T| ||math::geometry|1.2.3|1.3.1|EF, D, T| ||math::numtheory|1.1|1.1.1|EF, D, T| ||math::statistics __(1)__|1.1.1|1.5|EF, D, T| |||||| |mime|mime|1.6|1.6.2|B, D, T| ||smtp|1.4.5|1.5|EF, D, T| |||||| |namespacex|namespacex|0.1|0.2|EF, I, B, D, T| |ncgi|ncgi|1.4.3|1.4.4|B, D, T| |oauth|oauth|1.0.1|1.0.3|B, D| |png|png|0.2|0.3|EF, D, T| |practcl|practcl __(2)__|0.11|0.16.3|EF, I, D| |profiler|profiler|0.3|0.5|B, D, T| |||||| |pt|pt::peg::export|1|1.0.1|I, D, T| ||pt::peg::import|1|1.0.1|I, D, T| ||pt::peg::op|1.0.1|1.1.0|B, I, D| |||||| |sha1|sha1|2.0.3|2.0.4|B, D| ||sha256|1.0.3|1.0.4|B, D| |||||| |simulation|simulation::random|0.3.1|0.4.0|EF, D, T| |||||| |struct|struct::disjointset __(2)__|1.0|1.1|EF, I, D, T| ||struct::graph|2.4.1|2.4.3|B, D, T| ||struct::list|1.8.3|1.8.4|B, D, T| ||struct::matrix|2.0.3|2.0.4|B, D, T ||struct::record|1.2.1|1.2.2|B, D ,T| |||||| |textutil|textutil|0.8|0.9|EF, D, T| |uuid|uuid|1.0.5|1.0.7|B, D, T| |||||| |virtchannel_base|tcl::chan::cat|1.0.2|1.0.3|B, D| ||tcl::chan::halfpipe|1|1.0.1|B, T| |||||| |zip|zipfile::mkzip|1.2|1.2.1|B, D| |||||| Notes 1. Now requires Tcl 8.5+ 2. Now requires Tcl 8.6+ Unchanged ========= aes, ascii85, asn, base32, base32::core, base32::hex, base64, bee, bench, bench::in, bench::out::csv, bench::out::text, bibtex, calendar, char, cksum, clock::iso8601, clock::rfc2822, cmdline, comm, control, coroutine, coroutine::auto, counter, crc16, crc32, cron, csv, debug, debug::caller, debug::heartbeat, debug::timestamp, defer, des, dicttool, docstrip, docstrip::util, doctools::toc (v2), doctools::changelog, doctools::cvs, doctools::idx (v2), doctools::html, doctools::html::cssdefaults, doctools::idx::export::docidx, doctools::idx::export::html, doctools::idx::export::json, doctools::idx::export::nroff, doctools::idx::export::text, doctools::idx::export::wiki, doctools::idx::import::docidx, doctools::idx::import::json, doctools::idx::parse, doctools::idx::structure, |
︙ | ︙ | |||
177 178 179 180 181 182 183 | grammar::me::cpu::core, grammar::me::cpu::gasm, grammar::me::tcl, grammar::me::util, grammar::peg, grammar::peg::interp, hook, htmlparse, http::wget, huddle, huddle::json, ident, imap4, inifile, interp, interp::delegate::method, interp::delegate::proc, ip, irc, javascript, jpeg, json, json::write, lambda, ldap, ldapx, logger, logger::appender, map::geocode::nominatim, map::slippy, | | | 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 | grammar::me::cpu::core, grammar::me::cpu::gasm, grammar::me::tcl, grammar::me::util, grammar::peg, grammar::peg::interp, hook, htmlparse, http::wget, huddle, huddle::json, ident, imap4, inifile, interp, interp::delegate::method, interp::delegate::proc, ip, irc, javascript, jpeg, json, json::write, lambda, ldap, ldapx, logger, logger::appender, map::geocode::nominatim, map::slippy, map::slippy::cache, map::slippy::fetcher, mapproj, math, math::bigfloat, math::bignum, math::calculus::symdiff, math::complexnumbers, math::constants, math::decimal, math::exact, math::fourier, math::fuzzy, math::linearalgebra, math::machineparameters, math::optimize, math::PCA, math::polynomials, math::rationalfunctions, math::roman, md4, md5, md5crypt, multiplexer, nameserv, nameserv::auto, nameserv::common, nameserv::server, |
︙ | ︙ | |||
219 220 221 222 223 224 225 | pt::rde::nx, pt::rde::oo, pt::tclparam::configuration::nx, pt::tclparam::configuration::snit, pt::tclparam::configuration::tcloo, pt::util, rc4, rcs, report, resolv, rest, ripemd128, ripemd160, S3, SASL, SASL::NTLM, SASL::SCRAM, SASL::XGoogleToken, simulation::annealing, simulation::montecarlo, smtpd, snit, soundex, spf, stooop, string::token, string::token::shell, stringprep, sha1 (v1), | | | | 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | pt::rde::nx, pt::rde::oo, pt::tclparam::configuration::nx, pt::tclparam::configuration::snit, pt::tclparam::configuration::tcloo, pt::util, rc4, rcs, report, resolv, rest, ripemd128, ripemd160, S3, SASL, SASL::NTLM, SASL::SCRAM, SASL::XGoogleToken, simulation::annealing, simulation::montecarlo, smtpd, snit, soundex, spf, stooop, string::token, string::token::shell, stringprep, sha1 (v1), stringprep::data, struct, struct::graph::op, struct::pool, struct::prioqueue, struct::queue, struct::set, struct::skiplist, struct::stack, struct::tree, sum, switched, tar, tcl::chan::core, tcl::chan::events, tcl::chan::facade, tcl::chan::fifo, tcl::chan::fifo2, tcl::chan::memchan, tcl::chan::null, tcl::chan::nullzero, tcl::chan::random, tcl::chan::std, tcl::chan::string, tcl::chan::textwindow, tcl::chan::variable, tcl::chan::zero, tcl::randomseed, tcl::transform::adler32, tcl::transform::base64, tcl::transform::core, tcl::transform::counter, tcl::transform::crc32, tcl::transform::hex, tcl::transform::identity, |
︙ | ︙ |
Changes to support/releases/history/README-1.20.txt.
1 2 3 4 | Overview ======== 8 new packages in 7 modules | | | 1 2 3 4 5 6 7 8 9 10 11 12 | Overview ======== 8 new packages in 7 modules 47 changed packages in 30 modules 389 unchanged packages in 115 modules 446 packages, total in 131 modules, total Legend ====== Change Details Comments |
︙ | ︙ | |||
20 21 22 23 24 25 26 | None T Testsuite changes D Documentation updates -------- --------- ---------------------------------- New in Tcllib 1.20 ================== | | | | | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | None T Testsuite changes D Documentation updates -------- --------- ---------------------------------- New in Tcllib 1.20 ================== Module Package Version Comments ---------- -------------------- ------------- ---------- clay clay 0.8.6 fileutil fileutil::paths 1 Replaces: doctools::paths, (pt) paths. lazyset lazyset 1 ---------- -------------------- ------------- ---------- math math::quasirandom 1.0 math::trig 1.0 ---------- -------------------- ------------- ---------- practcl practcl 0.16.3 struct struct::map 1 Replaces: doctools::config, (pt) configuration. ---------- -------------------- ------------- ---------- textutil textutil::patch 0.1 textutil::wcswidth 35.1 ---------- -------------------- ------------- ---------- Deprecations in Tcllib 1.20 |
︙ | ︙ | |||
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | from Tcllib, causing `package require` to fail. Changes from Tcllib 1.19 to 1.20 ================================ Module Package From 1.19 To 1.20 Comments ------------------ ----------------------- ----------- --------- ---------- cache cache::async 0.3 0.3.1 B, D, T ------------------ ----------------------- ----------- --------- ---------- doctools doctools 1.4.21 1.5.6 B doctools::idx 1.0.7 1.1 EF, D, T doctools::toc 1.1.6 1.2 EF, B, D, T ------------------ ----------------------- ----------- --------- ---------- doctools2idx doctools::idx::export 0.2 0.2.1 I, D, T doctools::idx::import 0.2 0.2.1 I, D, T ------------------ ----------------------- ----------- --------- ---------- doctools2toc doctools::toc::export 0.2 0.2.1 I, D, T doctools::toc::import 0.2 0.2.1 I, D, T ------------------ ----------------------- ----------- --------- ---------- dtplite dtplite 1.3 1.3.1 B, D html html 1.4.4 1.4.5 EF, B, D, T http autoproxy (1) 1.6 1.7 EF, B, D, T | > > | > > | > > > > | | | 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | from Tcllib, causing `package require` to fail. Changes from Tcllib 1.19 to 1.20 ================================ Module Package From 1.19 To 1.20 Comments ------------------ ----------------------- ----------- --------- ---------- blowfish blowfish 1.0.4 1.0.5 B, D, T cache cache::async 0.3 0.3.1 B, D, T dns dns 1.4 1.4.1 B, D, T ------------------ ----------------------- ----------- --------- ---------- doctools doctools 1.4.21 1.5.6 B doctools::idx 1.0.7 1.1 EF, D, T doctools::toc 1.1.6 1.2 EF, B, D, T ------------------ ----------------------- ----------- --------- ---------- doctools2idx doctools::idx::export 0.2 0.2.1 I, D, T doctools::idx::import 0.2 0.2.1 I, D, T ------------------ ----------------------- ----------- --------- ---------- doctools2toc doctools::toc::export 0.2 0.2.1 I, D, T doctools::toc::import 0.2 0.2.1 I, D, T ------------------ ----------------------- ----------- --------- ---------- dtplite dtplite 1.3 1.3.1 B, D html html 1.4.4 1.4.5 EF, B, D, T http autoproxy (1) 1.6 1.7 EF, B, D, T httpd httpd 4.1.0 4.3.4 I, B, D, T ------------------ ----------------------- ----------- --------- ---------- log log 1.3 1.4 EF, D, T logger::utils 1.3 1.3.1 B, D, T ------------------ ----------------------- ----------- --------- ---------- markdown Markdown 1.1 1.1.1 B, T ------------------ ----------------------- ----------- --------- ---------- math math::calculus 0.8.2 0.8.2 D math::interpolate 1.1.1 1.1.2 B math::special (1) 0.3 0.4 EF, D, T math::geometry 1.2.3 1.3.1 EF, D, T, B math::numtheory 1.1 1.1.1 EF, D, T math::statistics (1) 1.1.1 1.5 EF, D, T ------------------ ----------------------- ----------- --------- ---------- mime mime 1.6 1.6.2 B, D, T smtp 1.4.5 1.5 EF, D, T ------------------ ----------------------- ----------- --------- ---------- namespacex namespacex 0.1 0.2 EF, I, B, D, T ncgi ncgi 1.4.3 1.4.4 B, D, T oauth oauth 1.0.1 1.0.3 B, D png png 0.2 0.3 EF, D, T practcl practcl (2) 0.11 0.16.3 EF, I, D profiler profiler 0.3 0.5 B, D, T ------------------ ----------------------- ----------- --------- ---------- pt pt::peg::export 1 1.0.1 I, D, T pt::peg::import 1 1.0.1 I, D, T pt::peg::op 1.0.1 1.1.0 B, I, D ------------------ ----------------------- ----------- --------- ---------- sha1 sha1 2.0.3 2.0.4 B, D sha256 1.0.3 1.0.4 B, D ------------------ ----------------------- ----------- --------- ---------- simulation simulation::random 0.3.1 0.4.0 EF, D, T ------------------ ----------------------- ----------- --------- ---------- struct struct::disjointset (2) 1.0 1.1 EF, I, D, T struct::graph 2.4.1 2.4.3 B, D, T struct::list 1.8.3 1.8.4 B, D, T struct::matrix 2.0.3 2.0.4 B, D, T struct::record 1.2.1 1.2.2 B, D, T ------------------ ----------------------- ----------- --------- ---------- textutil textutil 0.8 0.9 EF, D, T uuid uuid 1.0.5 1.0.7 B, D, T ------------------ ----------------------- ----------- --------- ---------- virtchannel_base tcl::chan::cat 1.0.2 1.0.3 B, D tcl::chan::halfpipe 1 1.0.1 B, T ------------------ ----------------------- ----------- --------- ---------- zip zipfile::mkzip 1.2 1.2.1 B, D ------------------ ----------------------- ----------- --------- ---------- Notes (1) Now requires Tcl 8.5+ (2) Now requires Tcl 8.6+ Unchanged ========= aes, ascii85, asn, base32, base32::core, base32::hex, base64, bee, bench, bench::in, bench::out::csv, bench::out::text, bibtex, calendar, char, cksum, clock::iso8601, clock::rfc2822, cmdline, comm, control, coroutine, coroutine::auto, counter, crc16, crc32, cron, csv, debug, debug::caller, debug::heartbeat, debug::timestamp, defer, des, dicttool, docstrip, docstrip::util, doctools::toc (v2), doctools::changelog, doctools::cvs, doctools::idx (v2), doctools::html, doctools::html::cssdefaults, doctools::idx::export::docidx, doctools::idx::export::html, doctools::idx::export::json, doctools::idx::export::nroff, doctools::idx::export::text, doctools::idx::export::wiki, doctools::idx::import::docidx, doctools::idx::import::json, doctools::idx::parse, doctools::idx::structure, |
︙ | ︙ | |||
176 177 178 179 180 181 182 | grammar::me::cpu::core, grammar::me::cpu::gasm, grammar::me::tcl, grammar::me::util, grammar::peg, grammar::peg::interp, hook, htmlparse, http::wget, huddle, huddle::json, ident, imap4, inifile, interp, interp::delegate::method, interp::delegate::proc, ip, irc, javascript, jpeg, json, json::write, lambda, ldap, ldapx, logger, logger::appender, map::geocode::nominatim, map::slippy, | | | 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | grammar::me::cpu::core, grammar::me::cpu::gasm, grammar::me::tcl, grammar::me::util, grammar::peg, grammar::peg::interp, hook, htmlparse, http::wget, huddle, huddle::json, ident, imap4, inifile, interp, interp::delegate::method, interp::delegate::proc, ip, irc, javascript, jpeg, json, json::write, lambda, ldap, ldapx, logger, logger::appender, map::geocode::nominatim, map::slippy, map::slippy::cache, map::slippy::fetcher, mapproj, math, math::bigfloat, math::bignum, math::calculus::symdiff, math::complexnumbers, math::constants, math::decimal, math::exact, math::fourier, math::fuzzy, math::linearalgebra, math::machineparameters, math::optimize, math::PCA, math::polynomials, math::rationalfunctions, math::roman, md4, md5, md5crypt, multiplexer, nameserv, nameserv::auto, nameserv::common, nameserv::server, |
︙ | ︙ | |||
218 219 220 221 222 223 224 | pt::rde::nx, pt::rde::oo, pt::tclparam::configuration::nx, pt::tclparam::configuration::snit, pt::tclparam::configuration::tcloo, pt::util, rc4, rcs, report, resolv, rest, ripemd128, ripemd160, S3, SASL, SASL::NTLM, SASL::SCRAM, SASL::XGoogleToken, simulation::annealing, simulation::montecarlo, smtpd, snit, soundex, spf, stooop, string::token, string::token::shell, stringprep, sha1 (v1), | | | | 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 | pt::rde::nx, pt::rde::oo, pt::tclparam::configuration::nx, pt::tclparam::configuration::snit, pt::tclparam::configuration::tcloo, pt::util, rc4, rcs, report, resolv, rest, ripemd128, ripemd160, S3, SASL, SASL::NTLM, SASL::SCRAM, SASL::XGoogleToken, simulation::annealing, simulation::montecarlo, smtpd, snit, soundex, spf, stooop, string::token, string::token::shell, stringprep, sha1 (v1), stringprep::data, struct, struct::graph::op, struct::pool, struct::prioqueue, struct::queue, struct::set, struct::skiplist, struct::stack, struct::tree, sum, switched, tar, tcl::chan::core, tcl::chan::events, tcl::chan::facade, tcl::chan::fifo, tcl::chan::fifo2, tcl::chan::memchan, tcl::chan::null, tcl::chan::nullzero, tcl::chan::random, tcl::chan::std, tcl::chan::string, tcl::chan::textwindow, tcl::chan::variable, tcl::chan::zero, tcl::randomseed, tcl::transform::adler32, tcl::transform::base64, tcl::transform::core, tcl::transform::counter, tcl::transform::crc32, tcl::transform::hex, tcl::transform::identity, |
︙ | ︙ |