mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-12-08 20:38:47 +00:00
@@ -1734,6 +1734,7 @@ Tcl:
|
|||||||
primary_extension: .tcl
|
primary_extension: .tcl
|
||||||
extensions:
|
extensions:
|
||||||
- .adp
|
- .adp
|
||||||
|
- .tm
|
||||||
|
|
||||||
Tcsh:
|
Tcsh:
|
||||||
type: programming
|
type: programming
|
||||||
|
|||||||
@@ -458,6 +458,9 @@
|
|||||||
".svh",
|
".svh",
|
||||||
".vh"
|
".vh"
|
||||||
],
|
],
|
||||||
|
"Tcl": [
|
||||||
|
".tm"
|
||||||
|
],
|
||||||
"Tea": [
|
"Tea": [
|
||||||
".tea"
|
".tea"
|
||||||
],
|
],
|
||||||
@@ -578,8 +581,8 @@
|
|||||||
".gemrc"
|
".gemrc"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"tokens_total": 470000,
|
"tokens_total": 471133,
|
||||||
"languages_total": 582,
|
"languages_total": 584,
|
||||||
"tokens": {
|
"tokens": {
|
||||||
"ABAP": {
|
"ABAP": {
|
||||||
"*/**": 1,
|
"*/**": 1,
|
||||||
@@ -47486,6 +47489,127 @@
|
|||||||
"x": 6,
|
"x": 6,
|
||||||
"endfunction": 1
|
"endfunction": 1
|
||||||
},
|
},
|
||||||
|
"Tcl": {
|
||||||
|
"#": 7,
|
||||||
|
"package": 2,
|
||||||
|
"require": 2,
|
||||||
|
"Tcl": 2,
|
||||||
|
"namespace": 6,
|
||||||
|
"eval": 2,
|
||||||
|
"stream": 61,
|
||||||
|
"{": 148,
|
||||||
|
"export": 3,
|
||||||
|
"[": 76,
|
||||||
|
"a": 1,
|
||||||
|
"-": 5,
|
||||||
|
"z": 1,
|
||||||
|
"]": 76,
|
||||||
|
"*": 19,
|
||||||
|
"}": 148,
|
||||||
|
"ensemble": 1,
|
||||||
|
"create": 7,
|
||||||
|
"proc": 28,
|
||||||
|
"first": 24,
|
||||||
|
"restCmdPrefix": 2,
|
||||||
|
"return": 22,
|
||||||
|
"list": 18,
|
||||||
|
"lassign": 11,
|
||||||
|
"foldl": 1,
|
||||||
|
"cmdPrefix": 19,
|
||||||
|
"initialValue": 7,
|
||||||
|
"args": 13,
|
||||||
|
"set": 34,
|
||||||
|
"numStreams": 3,
|
||||||
|
"llength": 5,
|
||||||
|
"if": 14,
|
||||||
|
"FoldlSingleStream": 2,
|
||||||
|
"lindex": 5,
|
||||||
|
"elseif": 3,
|
||||||
|
"FoldlMultiStream": 2,
|
||||||
|
"else": 5,
|
||||||
|
"Usage": 4,
|
||||||
|
"foreach": 5,
|
||||||
|
"numArgs": 7,
|
||||||
|
"varName": 7,
|
||||||
|
"body": 8,
|
||||||
|
"ForeachSingleStream": 2,
|
||||||
|
"(": 11,
|
||||||
|
")": 11,
|
||||||
|
"&&": 2,
|
||||||
|
"%": 1,
|
||||||
|
"end": 2,
|
||||||
|
"items": 5,
|
||||||
|
"lrange": 1,
|
||||||
|
"ForeachMultiStream": 2,
|
||||||
|
"fromList": 2,
|
||||||
|
"_list": 4,
|
||||||
|
"index": 4,
|
||||||
|
"expr": 4,
|
||||||
|
"+": 1,
|
||||||
|
"isEmpty": 10,
|
||||||
|
"map": 1,
|
||||||
|
"MapSingleStream": 3,
|
||||||
|
"MapMultiStream": 3,
|
||||||
|
"rest": 22,
|
||||||
|
"select": 2,
|
||||||
|
"while": 6,
|
||||||
|
"take": 2,
|
||||||
|
"num": 3,
|
||||||
|
"||": 1,
|
||||||
|
"<": 1,
|
||||||
|
"toList": 1,
|
||||||
|
"res": 10,
|
||||||
|
"lappend": 8,
|
||||||
|
"#################################": 2,
|
||||||
|
"acc": 9,
|
||||||
|
"streams": 5,
|
||||||
|
"firsts": 6,
|
||||||
|
"restStreams": 6,
|
||||||
|
"uplevel": 4,
|
||||||
|
"nextItems": 4,
|
||||||
|
"msg": 1,
|
||||||
|
"code": 1,
|
||||||
|
"error": 1,
|
||||||
|
"level": 1,
|
||||||
|
"XDG": 11,
|
||||||
|
"variable": 4,
|
||||||
|
"DEFAULTS": 8,
|
||||||
|
"DATA_HOME": 4,
|
||||||
|
"CONFIG_HOME": 4,
|
||||||
|
"CACHE_HOME": 4,
|
||||||
|
"RUNTIME_DIR": 3,
|
||||||
|
"DATA_DIRS": 4,
|
||||||
|
"CONFIG_DIRS": 4,
|
||||||
|
"SetDefaults": 3,
|
||||||
|
"ne": 2,
|
||||||
|
"file": 9,
|
||||||
|
"join": 9,
|
||||||
|
"env": 8,
|
||||||
|
"HOME": 3,
|
||||||
|
".local": 1,
|
||||||
|
"share": 3,
|
||||||
|
".config": 1,
|
||||||
|
".cache": 1,
|
||||||
|
"/usr": 2,
|
||||||
|
"local": 1,
|
||||||
|
"/etc": 1,
|
||||||
|
"xdg": 1,
|
||||||
|
"XDGVarSet": 4,
|
||||||
|
"var": 11,
|
||||||
|
"info": 1,
|
||||||
|
"exists": 1,
|
||||||
|
"XDG_": 4,
|
||||||
|
"Dir": 4,
|
||||||
|
"subdir": 16,
|
||||||
|
"dir": 5,
|
||||||
|
"dict": 2,
|
||||||
|
"get": 2,
|
||||||
|
"Dirs": 3,
|
||||||
|
"rawDirs": 3,
|
||||||
|
"split": 1,
|
||||||
|
"outDirs": 3,
|
||||||
|
"XDG_RUNTIME_DIR": 1
|
||||||
|
},
|
||||||
"Tea": {
|
"Tea": {
|
||||||
"<%>": 1,
|
"<%>": 1,
|
||||||
"template": 1,
|
"template": 1,
|
||||||
@@ -51241,6 +51365,7 @@
|
|||||||
"Stylus": 76,
|
"Stylus": 76,
|
||||||
"SuperCollider": 133,
|
"SuperCollider": 133,
|
||||||
"SystemVerilog": 541,
|
"SystemVerilog": 541,
|
||||||
|
"Tcl": 1133,
|
||||||
"Tea": 3,
|
"Tea": 3,
|
||||||
"TeX": 2701,
|
"TeX": 2701,
|
||||||
"Turing": 44,
|
"Turing": 44,
|
||||||
@@ -51393,6 +51518,7 @@
|
|||||||
"Stylus": 1,
|
"Stylus": 1,
|
||||||
"SuperCollider": 1,
|
"SuperCollider": 1,
|
||||||
"SystemVerilog": 4,
|
"SystemVerilog": 4,
|
||||||
|
"Tcl": 2,
|
||||||
"Tea": 1,
|
"Tea": 1,
|
||||||
"TeX": 2,
|
"TeX": 2,
|
||||||
"Turing": 1,
|
"Turing": 1,
|
||||||
@@ -51413,5 +51539,5 @@
|
|||||||
"Xtend": 2,
|
"Xtend": 2,
|
||||||
"YAML": 2
|
"YAML": 2
|
||||||
},
|
},
|
||||||
"md5": "1b2f1436b9e8b1bff75b4f13f34c390e"
|
"md5": "ae61e5c2d20e71a1a9df118bf8ea7a82"
|
||||||
}
|
}
|
||||||
201
samples/Tcl/stream-0.1.tm
Normal file
201
samples/Tcl/stream-0.1.tm
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
# A stream ensemble
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013 Lawrence Woodman <lwoodman@vlifesystems.com>
|
||||||
|
#
|
||||||
|
# Licensed under an MIT licence. Please see LICENCE.md for details.
|
||||||
|
#
|
||||||
|
|
||||||
|
package require Tcl 8.5
|
||||||
|
|
||||||
|
namespace eval stream {
|
||||||
|
namespace export {[a-z]*}
|
||||||
|
namespace ensemble create
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::create {first restCmdPrefix} {
|
||||||
|
return [list $first $restCmdPrefix]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::first {stream} {
|
||||||
|
lassign $stream first
|
||||||
|
return $first
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::foldl {cmdPrefix initialValue args} {
|
||||||
|
set numStreams [llength $args]
|
||||||
|
if {$numStreams == 1} {
|
||||||
|
FoldlSingleStream $cmdPrefix $initialValue [lindex $args 0]
|
||||||
|
} elseif {$numStreams > 1} {
|
||||||
|
FoldlMultiStream $cmdPrefix $initialValue $args
|
||||||
|
} else {
|
||||||
|
Usage "stream foldl cmdPrefix initalValue stream ?stream ..?"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::foreach {args} {
|
||||||
|
set numArgs [llength $args]
|
||||||
|
if {$numArgs == 3} {
|
||||||
|
lassign $args varName stream body
|
||||||
|
ForeachSingleStream $varName $stream $body
|
||||||
|
} elseif {($numArgs > 3) && (($numArgs % 2) == 1)} {
|
||||||
|
set body [lindex $args end]
|
||||||
|
set items [lrange $args 0 end-1]
|
||||||
|
ForeachMultiStream $items $body
|
||||||
|
} else {
|
||||||
|
Usage "stream foreach varName stream ?varName stream ..? body"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::fromList {_list {index 0}} {
|
||||||
|
if {$index >= [llength $_list]} {return {}}
|
||||||
|
create [lindex $_list $index] [list fromList $_list [expr {$index + 1}]]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::isEmpty {stream} {
|
||||||
|
expr {[llength $stream] == 0}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::map {cmdPrefix args} {
|
||||||
|
set numArgs [llength $args]
|
||||||
|
if {$numArgs == 1} {
|
||||||
|
MapSingleStream $cmdPrefix [lindex $args 0]
|
||||||
|
} elseif {$numArgs > 1} {
|
||||||
|
MapMultiStream $cmdPrefix $args
|
||||||
|
} else {
|
||||||
|
Usage "stream map cmdPrefix stream ?stream ..?"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::rest {stream} {
|
||||||
|
set rest [lindex $stream 1]
|
||||||
|
{*}$rest
|
||||||
|
}
|
||||||
|
|
||||||
|
# Note: This will work through the elements of the stream until it finds
|
||||||
|
# the first element that is matched by the cmdPrefix predicate.
|
||||||
|
proc stream::select {cmdPrefix stream} {
|
||||||
|
while {![isEmpty $stream]} {
|
||||||
|
lassign $stream first rest
|
||||||
|
if {[{*}$cmdPrefix $first]} {
|
||||||
|
return [create $first [list select $cmdPrefix [{*}$rest]]]
|
||||||
|
} else {
|
||||||
|
set stream [{*}$rest]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $stream
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::take {num stream} {
|
||||||
|
if {[isEmpty $stream] || $num <= 0} {
|
||||||
|
return [::list]
|
||||||
|
} else {
|
||||||
|
lassign $stream first rest
|
||||||
|
create $first [list take [expr {$num - 1}] [{*}$rest]]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::toList {stream} {
|
||||||
|
set res [::list]
|
||||||
|
while {![isEmpty $stream]} {
|
||||||
|
lassign $stream first rest
|
||||||
|
lappend res $first
|
||||||
|
set stream [{*}$rest]
|
||||||
|
}
|
||||||
|
return $res
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#################################
|
||||||
|
# Internal
|
||||||
|
#################################
|
||||||
|
|
||||||
|
proc stream::FoldlSingleStream {cmdPrefix initialValue stream} {
|
||||||
|
set acc $initialValue
|
||||||
|
while {![isEmpty $stream]} {
|
||||||
|
lassign $stream first rest
|
||||||
|
set acc [{*}$cmdPrefix $acc $first]
|
||||||
|
set stream [{*}$rest]
|
||||||
|
}
|
||||||
|
return $acc
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::FoldlMultiStream {cmdPrefix initialValue streams} {
|
||||||
|
set acc $initialValue
|
||||||
|
|
||||||
|
while 1 {
|
||||||
|
set firsts [::list]
|
||||||
|
set restStreams [::list]
|
||||||
|
::foreach stream $streams {
|
||||||
|
if {[isEmpty $stream]} {
|
||||||
|
return $acc
|
||||||
|
}
|
||||||
|
lassign $stream first rest
|
||||||
|
lappend firsts $first
|
||||||
|
lappend restStreams [{*}$rest]
|
||||||
|
}
|
||||||
|
set acc [{*}$cmdPrefix $acc {*}$firsts]
|
||||||
|
set streams $restStreams
|
||||||
|
}
|
||||||
|
return $acc
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::ForeachSingleStream {varName stream body} {
|
||||||
|
set res {}
|
||||||
|
while {![isEmpty $stream]} {
|
||||||
|
lassign $stream first rest
|
||||||
|
uplevel 2 [list set $varName $first]
|
||||||
|
set stream [{*}$rest]
|
||||||
|
set res [uplevel 2 $body]
|
||||||
|
}
|
||||||
|
return $res
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::ForeachMultiStream {items body} {
|
||||||
|
set res {}
|
||||||
|
|
||||||
|
while 1 {
|
||||||
|
set nextItems [::list]
|
||||||
|
::foreach {varName stream} $items {
|
||||||
|
if {[isEmpty $stream]} {
|
||||||
|
return $res
|
||||||
|
}
|
||||||
|
lassign $stream first rest
|
||||||
|
uplevel 2 [list set $varName $first]
|
||||||
|
lappend nextItems $varName
|
||||||
|
lappend nextItems [{*}$rest]
|
||||||
|
}
|
||||||
|
set res [uplevel 2 $body]
|
||||||
|
set items $nextItems
|
||||||
|
}
|
||||||
|
|
||||||
|
return $res
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::MapSingleStream {cmdPrefix stream} {
|
||||||
|
if {[isEmpty $stream]} {
|
||||||
|
return $stream
|
||||||
|
}
|
||||||
|
lassign $stream first rest
|
||||||
|
create [{*}$cmdPrefix $first] [list MapSingleStream $cmdPrefix [{*}$rest]]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::MapMultiStream {cmdPrefix streams} {
|
||||||
|
set firsts [::list]
|
||||||
|
set restStreams [::list]
|
||||||
|
|
||||||
|
::foreach stream $streams {
|
||||||
|
if {[isEmpty $stream]} {
|
||||||
|
return $stream
|
||||||
|
}
|
||||||
|
lassign $stream first rest
|
||||||
|
lappend firsts $first
|
||||||
|
lappend restStreams [{*}$rest]
|
||||||
|
}
|
||||||
|
|
||||||
|
return [create [{*}$cmdPrefix {*}$firsts] \
|
||||||
|
[list MapMultiStream $cmdPrefix $restStreams]]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc stream::Usage {msg} {
|
||||||
|
return -code error -level 2 "wrong # args: should be \"$msg\""
|
||||||
|
}
|
||||||
76
samples/Tcl/xdgbasedir-0.3.tm
Normal file
76
samples/Tcl/xdgbasedir-0.3.tm
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# XDG Base Directory Specification handling
|
||||||
|
#
|
||||||
|
# Copyright (C) 2013 Lawrence Woodman
|
||||||
|
#
|
||||||
|
# Licensed under an MIT licence. Please see LICENCE.md for details.
|
||||||
|
#
|
||||||
|
# For XDG Base Directory Specification
|
||||||
|
# http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||||
|
#
|
||||||
|
package require Tcl 8.5
|
||||||
|
|
||||||
|
namespace eval XDG {
|
||||||
|
variable DEFAULTS ""
|
||||||
|
namespace export DATA_HOME CONFIG_HOME CACHE_HOME
|
||||||
|
namespace export RUNTIME_DIR DATA_DIRS CONFIG_DIRS
|
||||||
|
}
|
||||||
|
|
||||||
|
proc XDG::SetDefaults {} {
|
||||||
|
variable DEFAULTS
|
||||||
|
if {$DEFAULTS ne ""} return
|
||||||
|
set DEFAULTS [list \
|
||||||
|
DATA_HOME [file join $::env(HOME) .local share] \
|
||||||
|
CONFIG_HOME [file join $::env(HOME) .config] \
|
||||||
|
CACHE_HOME [file join $::env(HOME) .cache] \
|
||||||
|
DATA_DIRS [list [file join /usr local share] [file join /usr share]] \
|
||||||
|
CONFIG_DIRS [list [file join /etc xdg ]]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc XDG::XDGVarSet {var} {
|
||||||
|
expr {[info exists ::env(XDG_$var)] && $::env(XDG_$var) ne ""}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc XDG::Dir {var {subdir ""} } {
|
||||||
|
variable DEFAULTS
|
||||||
|
SetDefaults
|
||||||
|
set dir [dict get $DEFAULTS $var]
|
||||||
|
|
||||||
|
if {[XDGVarSet $var]} {
|
||||||
|
set dir $::env(XDG_$var)
|
||||||
|
}
|
||||||
|
|
||||||
|
return [file join $dir $subdir]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc XDG::Dirs {var {subdir ""} } {
|
||||||
|
variable DEFAULTS
|
||||||
|
SetDefaults
|
||||||
|
set rawDirs [dict get $DEFAULTS $var]
|
||||||
|
|
||||||
|
if {[XDGVarSet $var]} {
|
||||||
|
set rawDirs [split $::env(XDG_$var) ":"]
|
||||||
|
}
|
||||||
|
|
||||||
|
set outDirs {}
|
||||||
|
foreach dir $rawDirs {
|
||||||
|
lappend outDirs [file join $dir $subdir]
|
||||||
|
}
|
||||||
|
return $outDirs
|
||||||
|
}
|
||||||
|
|
||||||
|
# The remaining procs reference the environmental variables XDG_
|
||||||
|
# followed by the proc name.
|
||||||
|
proc XDG::DATA_HOME {{subdir ""}} {Dir DATA_HOME $subdir}
|
||||||
|
proc XDG::CONFIG_HOME {{subdir ""}} {Dir CONFIG_HOME $subdir}
|
||||||
|
proc XDG::CACHE_HOME {{subdir ""}} {Dir CACHE_HOME $subdir}
|
||||||
|
|
||||||
|
proc XDG::RUNTIME_DIR {{subdir ""}} {
|
||||||
|
if {![XDGVarSet RUNTIME_DIR]} { return {} }
|
||||||
|
return [file join $::env(XDG_RUNTIME_DIR) $subdir]
|
||||||
|
}
|
||||||
|
|
||||||
|
# The following procs returning the directories as a list with the most
|
||||||
|
# important first.
|
||||||
|
proc XDG::DATA_DIRS {{subdir ""}} {Dirs DATA_DIRS $subdir}
|
||||||
|
proc XDG::CONFIG_DIRS {{subdir ""}} {Dirs CONFIG_DIRS $subdir}
|
||||||
Reference in New Issue
Block a user