История изменений
Исправление Xenius, (текущая версия) :
Например, записывать что-то типа SUM_{d|n} {…} - сумма по всем делителям числа n. Сейчас для этого приходится городить вложенные циклы.
Я вот для пробы что-то такое накостылил на Tcl, на предложенном примере работает:
proc from {first to last {stringStep step} {step 1}} {
if {$first > $last} {
set tmp $first
set first $last
set last $tmp
unset tmp
}
if {$to ne "to" || $stringStep ne "step"} {
error "usage: from First to Last ?step Step?"
}
set result {}
for {set i $first} {$i<=$last} {incr i $step} {
lappend result $i
}
return $result
}
proc ∑ {varName expression listInt args} {
set result 0
# determine condition to use
if {[llength $args]==0} {
set cond 1
} elseif {[llength $args]!=2 || [lindex $args 0] ne "|"} {
error "usage: ∑ varName expression listInt ?| condition?"
} else {
set cond [lindex $args 1]
}
# actual cycle
foreach item [uplevel [
list lmap $varName $listInt "
if [list $cond] {
apply [list [list $varName [list expr $expression]]] $[list $varName]
} else {
continue
}"
]] {
set result [expr {$result+$item}]
}
return $result
}
% set n 12
% ∑ i {$i**2} [from 1 to $n] | {$n%$i==0}
210
Можно ли так сделать в других скриптовых языках?
Исправление Xenius, :
Например, записывать что-то типа SUM_{d|n} {…} - сумма по всем делителям числа n. Сейчас для этого приходится городить вложенные циклы.
Я вот для пробы что-то такое накостылил на Tcl, на этом примере работает:
proc from {first to last {stringStep step} {step 1}} {
if {$first > $last} {
set tmp $first
set first $last
set last $tmp
unset tmp
}
if {$to ne "to" || $stringStep ne "step"} {
error "usage: from First to Last ?step Step?"
}
set result {}
for {set i $first} {$i<=$last} {incr i $step} {
lappend result $i
}
return $result
}
proc ∑ {varName expression listInt args} {
set result 0
# determine condition to use
if {[llength $args]==0} {
set cond 1
} elseif {[llength $args]!=2 || [lindex $args 0] ne "|"} {
error "usage: ∑ varName expression listInt ?| condition?"
} else {
set cond [lindex $args 1]
}
# actual cycle
foreach item [uplevel [
list lmap $varName $listInt "
if [list $cond] {
apply [list [list $varName [list expr $expression]]] $[list $varName]
} else {
continue
}"
]] {
set result [expr {$result+$item}]
}
return $result
}
% set n 12
% ∑ i {$i**2} [from 1 to $n] | {$n%$i==0}
210
Можно ли так сделать в других скриптовых языках?
Исправление Xenius, :
Например, записывать что-то типа SUM_{d|n} {…} - сумма по всем делителям числа n. Сейчас для этого приходится городить вложенные циклы.
Я вот для пробы что-то такое накостылил на Tcl, на этом примере работает:
proc from {first to last {stringStep step} {step 1}} {
if {$first > $last} {
set tmp $first
set first $last
set last $first
unset tmp
}
if {$to ne "to" || $stringStep ne "step"} {
error "usage: from First to Last ?step Step?"
}
set result {}
for {set i $first} {$i<=$last} {incr i $step} {
lappend result $i
}
return $result
}
proc ∑ {varName expression listInt args} {
set result 0
# determine condition to use
if {[llength $args]==0} {
set cond 1
} elseif {[llength $args]!=2 || [lindex $args 0] ne "|"} {
error "usage: ∑ varName expression listInt ?| condition?"
} else {
set cond [lindex $args 1]
}
# actual cycle
foreach item [uplevel [
list lmap $varName $listInt "
if [list $cond] {
apply [list [list $varName [list expr $expression]]] $[list $varName]
} else {
continue
}"
]] {
set result [expr {$result+$item}]
}
return $result
}
% set n 12
% ∑ i {$i**2} [from 1 to $n] | {$n%$i==0}
210
Можно ли так сделать в других скриптовых языках?
Исходная версия Xenius, :
Например, записывать что-то типа SUM_{d|n} {…} - сумма по всем делителям числа n. Сейчас для этого приходится городить вложенные циклы.
Я вот для пробы что-то такое накостылил на Tcl, на этом примере работает:
proc from {first to last {stringStep step} {step 1}} {
if {$to ne "to" || $stringStep ne "step"} {
error "usage: from First to Last ?step Step?"
}
set result {}
for {set i $first} {$i<=$last} {incr i $step} {
lappend result $i
}
return $result
}
proc ∑ {varName expression listInt args} {
set result 0
# determine condition to use
if {[llength $args]==0} {
set cond 1
} elseif {[llength $args]!=2 || [lindex $args 0] ne "|"} {
error "usage: ∑ varName expression listInt ?| condition?"
} else {
set cond [lindex $args 1]
}
# actual cycle
foreach item [uplevel [
list lmap $varName $listInt "
if [list $cond] {
apply [list [list $varName [list expr $expression]]] $[list $varName]
} else {
continue
}"
]] {
set result [expr {$result+$item}]
}
return $result
}
% set n 12
% ∑ i {$i**2} [from 1 to $n] | {$n%$i==0}
210
Можно ли так сделать в других скриптовых языках?