LINUX.ORG.RU

Велосипед, TCL


0

0

Извините, что так много.
Скажите пожалуйста, почему этот код - хреновый?
Может, надо по-другому?

proc main {argv} {
	set ::wrcred {rublei rubl rubla rubla rubla rublei rublei rublei rublei rublei}
	set ::wkcred {kopeek kopeika kopeik kopeik kopeik kopeek kopeek kopeek kopeek kopeek}
	set ::wtcred {tisach tisacha tisachi tisachi tisachi tisach tisach tisach tisach tisach}
	set ::balcred [split [lindex $argv 0] "."]
	puts "got balcred $::balcred"
	set ::credr [lindex $::balcred 0]
	set ::credk [lindex $::balcred 1]
	set ::rlen [llength [split $::credr ""]]
	set ::klen [llength [split $::credk ""]]

	switch $::rlen {
		1 {ordnum}
		2 {decnum}
		3 {hndnum}
		4 {thnnum}
	}

	switch $::klen {
		1 {kordnum}
		2 {kdecnum}
	}

}

proc ordnum {} {
	switch -regexp $::credr {
		^0$ {puts "$::credr [lindex $::wrcred $::credr]"; return}
		^1$ {puts "$::credr [lindex $::wrcred $::credr]"; return}
		^[2-4]$ {puts "$::credr [lindex $::wrcred $::credr]"; return}
		^[5-9]$ {puts "$::credr [lindex $::wrcred $::credr]"; return}
	}
}

anonymous

proc kordnum {} {
	set ord [lindex [split $::credk ""] 1]
	switch -regexp $::credk {
		^0$ {puts "0 [lindex $::wkcred $::credk]"; exit}
		^1$ {puts "1_f [lindex $::wkcred $::credk]"; exit}
		^2$ {puts "2_f [lindex $::wkcred $::credk]"; exit}
		^[3-4]$ {puts "$::credk [lindex $::wkcred $::credk]"; exit}
		^[5-9]$ {puts "$::credk [lindex $::wkcred $::credk]"; exit}
	}
}

proc decnum {} {
	set dec [lindex [split $::credr ""] 0]
	set ord [lindex [split $::credr ""] 1]
	switch -regexp $::credr {
		^[1-9]0$ {puts "$::credr rublei"; return}
		^1[1-9]$ {puts "$::credr rublei"; return}
		^[2-9][1-9]$ {puts "[expr $dec*10] $ord [lindex $::wrcred $ord]"; return}
	}
}

proc kdecnum {} {
	set dec [lindex [split $::credk ""] 0]
	set ord [lindex [split $::credk ""] 1]
	if {$ord==1} {
		set ord "1_f"
	} elseif {$ord==2} {
		set ord "2_f"
	}
	switch -regexp $::credk {
		^[1-9]0$ {puts "$::credk kopeek"; exit}
		^1[1-9]$ {puts "$::credk kopeek"; exit}
		^[2-9][1-9]$ {puts "[expr $dec*10] $ord [lindex $::wkcred [lindex [split $ord ""] 0]]"; exit}
	}
}


proc hndnum {} {
	set hnd [lindex [split $::credr ""] 0]
	set dec [lindex [split $::credr ""] 1]
	set ord [lindex [split $::credr ""] 2]
	switch -regexp $::credr {
		^[1-9]00$ {puts "$::credr rublei"; return}
		^[1-9]0[1-9]$ {puts "[expr $hnd*100] $ord [lindex $::wrcred $ord]"; return}
		^[1-9]1[1-9]$ {puts "[expr $hnd*100] $dec$ord rublei"; return}
		^[1-9][1-9]0$ {puts "[expr $hnd*100] $dec$ord rublei"; return}
		^[1-9][2-9][1-9]$ {puts "[expr $hnd*100] [expr $dec*10] $ord [lindex $::wrcred $ord]"; return}
	}
}

proc thnnum {} {
	set thn [lindex [split $::credr ""] 0]
	set hnd [lindex [split $::credr ""] 1]
	set dec [lindex [split $::credr ""] 2]
	set ord [lindex [split $::credr ""] 3]
	if {$thn==1} {
		set thn "1_f"
	} elseif {$thn==2} {
		set thn "2_f"
	}
	switch -regexp $::credr {
		^[1-9]000$ {puts "$thn [lindex $::wtcred [lindex [split $thn ""] 0]] rublei"; return}
		^[1-9]00[1-9]$ {puts "$thn [lindex $::wtcred [lindex [split $thn ""] 0]] $ord [lindex $::wrcred $ord]"; return}
		^[1-9]01[1-9]$ {puts "$thn [lindex $::wtcred [lindex [split $thn ""] 0]] $dec$ord rublei"; return}
		^[1-9]0[1-9]0$ {puts "$thn [lindex $::wtcred [lindex [split $thn ""] 0]] $dec$ord rublei"; return}
		^[1-9]0[1-9][1-9]$ {puts "$thn [lindex $::wtcred [lindex [split $thn ""] 0]] $dec$ord [lindex $::wrcred $ord]"; return}
		^[1-9][1-9]00$ {puts "$thn [lindex $::wtcred [lindex [split $thn ""] 0]] [expr $hnd*100] rublei"; return}
		^[1-9][1-9]0[1-9] {puts "$thn [lindex $::wtcred [lindex [split $thn ""] 0]] [expr $hnd*100] $ord [lindex $::wrcred $ord]"; return}
		^[1-9][1-9]1[1-9]$ {puts "$thn [lindex $::wtcred [lindex [split $thn ""] 0]] [expr $hnd*100] $dec$ord rublei"; return}
		^[1-9][1-9][1-9]0$ {puts "$thn [lindex $::wtcred [lindex [split $thn ""] 0]] [expr $hnd*100] $dec$ord rublei"; return}
		^[1-9][1-9][2-9][1-9] {puts "$thn [lindex $::wtcred [lindex [split $thn ""] 0]] [expr $hnd*100] [expr $dec*10] $ord [lindex $::wrcred $ord]"; return}
	}
}

main $argv

anonymous
()

бездна копипаста, который в Tcl неуместен. вся работа выполняется в глобальном пространстве имён. вот два основных замечания навскидку

вообще - нормальный скрипт для использования, но очень плохой для поддержки

jtootf ★★★★★
()
Ответ на: комментарий от anonymous

>через врожденную глупость забыл - эта штука пытается писать суммы прописью.

через врождённую вежливость этот момент комментировать я не буду. исходники могли бы быть короче раз в десять. и дело тут даже не в используемом языке

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Я только учусь, и поэтому пишу вот такие макароны.
Может, нужно не регэкспы для разбора чисел использовать?
Есть другой алгоритм?

anonymous
()
Ответ на: комментарий от anonymous

Re^2: Велосипед, TCL

Слегка покомментирую:

> if {$ord==1} {

> set ord "1_f"

> } elseif {$ord==2} {

> set ord "2_f"

> }

append ord "_f"

> set hnd [lindex [split $::credr ""] 0]

> set dec [lindex [split $::credr ""] 1]

> set ord [lindex [split $::credr ""] 2]

foreach {hnd dec ord} [ split $::credr "" ] {}

Ну и глобально: жутко много копипасты, как уже и говорили.

gaa ★★
()

Если честно, не понял смысла:

proc ordnum {} {
 switch -regexp $::credr {
  ^0$     {puts "$::credr [lindex $::wrcred $::credr]"; return}
  ^1$     {puts "$::credr [lindex $::wrcred $::credr]"; return}
  ^[2-4]$ {puts "$::credr [lindex $::wrcred $::credr]"; return}
  ^[5-9]$ {puts "$::credr [lindex $::wrcred $::credr]"; return}
  }
 }

Тогда хотя бы так:

proc ordnum {} {
 switch -regexp $::credr {
  ^0$     -
  ^1$     -
  ^[2-4]$ -
  ^[5-9]$ {puts "$::credr [lindex $::wrcred $::credr]"}
  }
 }

Хотя и это всего лишь:

proc ordnum {} {
 if {[string is digit $::credr]} {puts "$::credr [lindex $::wrcred $::credr]"}
 }

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.