LINUX.ORG.RU

История изменений

Исправление 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
}
Если этот код выполнить в текущем интерпретаторе (например положить в файл sum.tcl и сделать source sum.tcl), потом можно будет сделать вот так:
% set n 12
% ∑ i {$i**2} [from 1 to $n] | {$n%$i==0}
210
И получить сумму квадратов делителей числа $n, например.

Можно ли так сделать в других скриптовых языках?

Исправление 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
}
Если этот код выполнить в текущем интерпретаторе (например положить в файл sum.tcl и сделать source sum.tcl), потом можно будет сделать вот так:
% set n 12
% ∑ i {$i**2} [from 1 to $n] | {$n%$i==0}
210
И получить сумму квадратов делителей числа $n, например.

Можно ли так сделать в других скриптовых языках?

Исправление 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
}
Если этот код выполнить в текущем интерпретаторе (например положить в файл sum.tcl и сделать source sum.tcl), потом можно будет сделать вот так:
% set n 12
% ∑ i {$i**2} [from 1 to $n] | {$n%$i==0}
210
И получить сумму квадратов делителей числа $n, например.

Можно ли так сделать в других скриптовых языках?

Исходная версия 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
}
Если этот код выполнить в текущем интерпретаторе (например положить в файл sum.tcl и сделать source sum.tcl), потом можно будет сделать вот так:
% set n 12
% ∑ i {$i**2} [from 1 to $n] | {$n%$i==0}
210
И получить сумму квадратов делителей числа $n, например.

Можно ли так сделать в других скриптовых языках?