如何将整数传递给 vmd 中的 tcl 过程
How to pass integers to tcl procedure in vmd
我是 tcl 编程的新手,我需要为 vmd 编写一个脚本来计算两对原子之间的两个距离并将它们打印在输出文件中。我不明白为什么不能采取atom_1等措施。这是我的脚本,感谢您的帮助
proc distance {distance_1 atom_1 atom_2 distance_2 atom_3 atom_4 output} {
set outfile [open $output w]
puts $outfile "frame, $distance_1, $distance_2"
set nf [molinfo top get numframes]
for {set i 0} {$i < $nf} {incr i} {
set d1 [measure bond {$atom_1 $atom_2} frame $i]
set d2 [measure bond {$atom_3 $atom_4} frame $i]
puts $outfile "$i , $d1 , $d2"
}
close $outfile
}
这里的问题是:
measure bond {$atom_1 $atom_2} frame $i
问题是 Tcl 中的 {
…}
实际上 的意思是“完全引用这个,根本没有替换”。它不是发送一个包含两个数字的列表,而是传递一个包含两个非数字的列表(文字字符串 $atom_1
和 $atom_2
)。
修复方法是将 {$atom_1 $atom_2}
替换为 [list $atom_1 $atom_2]
。
是的,proc
和 for
以及 if
利用了这种行为。只是他们将事情作为执行的一部分传递回 Tcl 解释器引擎。
我是 tcl 编程的新手,我需要为 vmd 编写一个脚本来计算两对原子之间的两个距离并将它们打印在输出文件中。我不明白为什么不能采取atom_1等措施。这是我的脚本,感谢您的帮助
proc distance {distance_1 atom_1 atom_2 distance_2 atom_3 atom_4 output} {
set outfile [open $output w]
puts $outfile "frame, $distance_1, $distance_2"
set nf [molinfo top get numframes]
for {set i 0} {$i < $nf} {incr i} {
set d1 [measure bond {$atom_1 $atom_2} frame $i]
set d2 [measure bond {$atom_3 $atom_4} frame $i]
puts $outfile "$i , $d1 , $d2"
}
close $outfile
}
这里的问题是:
measure bond {$atom_1 $atom_2} frame $i
问题是 Tcl 中的 {
…}
实际上 的意思是“完全引用这个,根本没有替换”。它不是发送一个包含两个数字的列表,而是传递一个包含两个非数字的列表(文字字符串 $atom_1
和 $atom_2
)。
修复方法是将 {$atom_1 $atom_2}
替换为 [list $atom_1 $atom_2]
。
是的,proc
和 for
以及 if
利用了这种行为。只是他们将事情作为执行的一部分传递回 Tcl 解释器引擎。