注意這個變化:
- Removed the encoding alias
binarytoiso8859-1
在 Tcl 9 之前的寫法是 -encoding binary。但是在 Tcl 9 之後如果使用 -encoding binary,會出現一個警告,如果要與之前的語義相同,要將 binary 改為 iso8859-1。下面是一個使用的例子:
fconfigure $fd -blocking 1 -encoding iso8859-1 -translation binary
注意這個變化:
binary to iso8859-1在 Tcl 9 之前的寫法是 -encoding binary。但是在 Tcl 9 之後如果使用 -encoding binary,會出現一個警告,如果要與之前的語義相同,要將 binary 改為 iso8859-1。下面是一個使用的例子:
fconfigure $fd -blocking 1 -encoding iso8859-1 -translation binary
Tcl 9.0 的其中一個改變,就是移除了 --disable-threads 編譯選項,所以從 9.0.0 開始都會是 thread-enabled。不過也因為如此,如果你使用下列的方式檢查:
expr {[info exists ::tcl_platform(threaded)] && $::tcl_platform(threaded)}
在 Tcl 9 會得到答案為 0,因為 ::tcl_platform(threaded) 在 Tcl 9 中並不存在。
所以我改寫如下:
#
# Check support thread or not
#
proc is_threaded {} {
# Tcl 9 always thread-enabled
if {[package vcompare [info patchlevel] "9.0"] < 0} {
return [expr {[info exists ::tcl_platform(threaded)] && $::tcl_platform(threaded)}]
} else {
return 1
}
}
目前暫時先這樣,如果有更好的寫法我再更改寫法。
2024/11/16 更新寫法,嘗試使用 package vcompare 來比對版本號。
最近的 openSUSE build service 在 devel:languages:tcl/tcl 對 Tcl 套件做了修改,移掉了 Tcl source code 中關於 SQLite3 套件的部份,同時建立與 sqlite3-tcl 套件的依賴性(而這個套件來自於 sqlite3)。
我覺得這似乎有彼此依賴的問題(不確定),不過這樣我就必須把 SQLite3 套件也做一個連結到我 openSUSE build service 的計畫中,才能夠解決其它套件的相依性問題(因為現在 Tcl 會對 sqlite3-tcl 套件產生依賴)。
set s "Hello "
set t "Tcl"
set u "!"
puts $s$t$u
set s "Hello "
set t "Tcl"
set u "!"
set str $s$t$u
puts $str
tclsh - << "EOF"
puts "HELLO World"
EOF
tclsh - << "EOF"
puts [expr 99 + 1]
EOF
sudo zypper install qemu-arm
wget https://download.opensuse.org/ports/aarch64/factory/images/openSUSE-Tumbleweed-ARM-JeOS-efi.aarch64-Current.raw.xz
unxz openSUSE-Tumbleweed-ARM-JeOS-efi.aarch64-Current.raw.xz
wget https://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.img.gz
gzip -d QEMU_EFI.img.gz
qemu-system-aarch64 -m 2048 -cpu cortex-a57 -smp 2 -M virt -bios QEMU_EFI.img -serial stdio -device virtio-net-device,netdev=hostnet0,id=net0,mac=52:54:00:09:a4:37 -netdev user,id=hostnet0 -drive if=none,format=raw,file=openSUSE-Tumbleweed-ARM-JeOS-efi.aarch64-Current.raw,id=hd0 -device virtio-blk-device,drive=hd0
package require xqilla
xqilla db
set exprs [db prepare {days-from-duration(xs:dateTime('2019-06-14T00:00:00') - current-dateTime())}]
set result [$exprs execute]
set diff 0
while {[$result next]} {
set diff [$result string_value]
}
puts "The answer is $diff."
$result close
$exprs close
db close
package require tdbc::sqlite3
tdbc::sqlite3::connection create db :memory:
set statement [db prepare {SELECT CAST ((JulianDay('2019-06-14') - JulianDay('now')) as Integer) as d}]
set diff 0
$statement foreach row {
if {[catch {set diff [dict get $row d]}]} {
set diff 0
}
}
puts "The answer is $diff."
$statement close
db close
#!/usr/bin/env tclsh
puts "Platform: $tcl_platform(os)"
puts "Arch: $tcl_platform(machine)"
proc uuid {} {
try {
package require sqlite3
sqlite3 db1 ":memory:"
set u [db1 onecolumn {select (hex(randomblob(16)))}]
db1 close
return [string range $u 0 7]-[string range $u 8 11]-[string range $u 12 15]-[string range $u 16 19]-[string range $u 20 end]
} on error {em} {
error $em
}
}
#!/usr/bin/env tclsh
package require http
package require tls
http::register https 443 [list ::tls::socket -ssl3 0 -ssl2 0 -tls1 1]
set tok {}
set url {https://duckduckgo.com/}
try {
set tok [http::geturl $url -method GET -timeout 3000]
puts "Status: [::http::ncode $tok]"
puts "Status Text: [http::status $tok]"
puts "Headers: [http::meta $tok]"
} on error {em} {
puts "Error: $em"
} finally {
# cleanup here
if {[info exists tok]==1} {
http::cleanup $tok
}
}
# Get data sources list and list
tablelist::tablelist .t -columns {0 "DSN" 0 "Driver"} -stretch all \
-background white -font {Helvetica -14}
pack .t -fill both -expand 1 -side top
set sources [::tdbc::odbc::datasources]
foreach {dsn driver} $sources {
.t insert end [list $dsn $driver]
}
[general]
drivers = -jack,
string cat $var
lindex $var
#!/bin/bash
if [ -f '/etc/os-release' ]; then
cat '/etc/os-release' | grep -w "^NAME" | sed -e 's/NAME=//g'
fi
#!/usr/bin/env tclsh
#
# Execute external program to get result
#
package require Tcl 8.6
set myfunction {{} {
return [exec cat /etc/os-release | grep -w "^NAME" | sed -e "s/NAME=//g"]
}}
if {[file exists "/etc/os-release"]==1} {
puts [apply $myfunction]
}
set doublequotes {"It is double quotes"}
string map [list {"} {\"}] $doublequotes
string map [list {\"} {"}] $doublequotes
proc getKernelName {} {
set mychannel [open "|/usr/bin/uname -s"]
set name [chan gets $mychannel]
chan close $mychannel
return $name
}