2012-04-04 14 views
9

Làm thế nào để biết tên của proc là gì. Ý tôi là tôi cần điều này:TCL lấy tên proc trong đó tôi là

proc nameOfTheProc {} { 

    #a lot of code here 
    puts "ERROR: You are using 'nameOfTheProc' proc wrongly" 
} 

vì vậy tôi muốn lấy "nameOfTheProc" nhưng không phải là mã cứng. Vì vậy, khi ai đó sẽ thay đổi tên proc, nó sẽ vẫn hoạt động bình thường.

+0

+1 câu hỏi hay, nó tạo ra nhiều câu trả lời thú vị. –

Trả lời

11

Bạn có thể sử dụng lệnh info level cho vấn đề của bạn:

proc nameOfTheProc {} { 

    #a lot of code here 
    puts "ERROR: You are using '[lindex [info level [info level]] 0]' proc wrongly" 
    puts "INFO: You specified the arguments: '[lrange [info level [info level]] 1 end]'" 
} 

Với khu vực nội info level bạn sẽ nhận được mức độ sâu gọi thủ tục mà bạn đang xem trong Người ngoài sẽ trở lại với tên của các thủ tục. chinh no.

+2

'[mức độ thông tin [mức độ thông tin]]' có thể được viết là '[mức thông tin 0]'… –

+0

@Donal: Có - bạn nói đúng. – bmk

+2

Nếu vậy tại sao không chỉnh sửa câu trả lời? – zehelvion

5

Nếu bạn chạy Tcl 8.5 trở lên, lệnh info frame sẽ trả về giá trị dict thay vì danh sách. Vì vậy, thay đổi mã như sau:

proc nameOfTheProc {} { 
    puts "This is [dict get [info frame [info frame]] proc]" 
} 
+0

Điều đó không hoàn toàn đúng. 'mức thông tin' sẽ vẫn trả về một danh sách (ít nhất là trong phiên bản 8.5). Nhưng 'khung thông tin' trả về một dict. – bmk

+0

@bmk Bạn hoàn toàn đúng - Tôi đã sửa câu trả lời để khung thông tin trong văn bản. – Jackson

+0

Mức thông tin là về danh sách đối số, khung thông tin là về các bộ mô tả khung chung. Hai bổ sung cho nhau. –

5

Cách thành ngữ đúng để đạt được những gì ngụ ý trong câu hỏi của bạn là sử dụng return -code error $message như thế này:

proc nameOfTheProc {} { 
    #a lot of code here 
    return -code error "Wrong sequence of blorbs passed" 
} 

Bằng cách này thủ tục của bạn sẽ cư xử một cách chính xác trong một cách các lệnh Tcl thực hiện khi chúng không hài lòng với những gì chúng đã được gọi: nó sẽ gây ra lỗi tại trang cuộc gọi.

+0

+1 Tôi đang sử dụng @kostix. –

+0

Điều này không cho tôi biết những gì proc được gọi là, phải không? – Narek

+0

@Narek, bạn sẽ thấy điều này từ theo dõi ngăn xếp sẽ bao gồm cả thông báo lỗi và tên của thủ tục trả lại lỗi. Nếu bạn gặp lỗi đó (nghĩa là không cho phép thời gian chạy chấm dứt chương trình và kết xuất dấu vết ngăn xếp), bạn sẽ có thể kiểm tra tình huống bằng cách sử dụng các công cụ được mô tả trong ['return'] (http: //www.tcl. tk/man/tcl8.5/TclCmd/return.htm) hướng dẫn sử dụng ('errorInfo', vv). – kostix