aboutsummaryrefslogtreecommitdiff
path: root/jim-stdlib-1.0.tcl
blob: 81ec2f917280b7252f7c95ed0e31455f641100bd (plain)
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
# Jim stdlib - a pure-Jim extension library for Jim
#
# Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# A copy of the license is also included in the source distribution
# of Jim, as a TXT file name called LICENSE.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# To use this library just do [package require stdlib]
# Make sure this file is in one directory specified in $jim_libpath

package provide stdlib 1.0

### Functional programming ###

proc curry {cmd args} {
    lambda args [list cmd [list pref $args]] {
        uplevel 1 [list $cmd {expand}$pref {expand}$args]
    }
}

proc memoize {} {{Memo {}}} {
    set cmd [info level -1]
    if {[info level] > 2 && [lindex [info level -2] 0] eq "memoize"} return
    if {![info exists Memo($cmd)]} {set Memo($cmd) [eval $cmd]}
    return -code return $Memo($cmd)
}

### Control structures ###

proc repeat {n body} {
    for {set i 0} {$i < $n} {incr i} {
        uplevel 1 $body
    }
}

### List procedures ###

proc first {list} {lindex $list 0}
proc rest {list} {lrange $list 1 end}
proc last {list} {lindex $list end}

### EOF ###