LINUX.ORG.RU

tcl - есть ли apply как в лиспе?

 , ,


0

1

Как можно догадаться, я сейчас реализую некоторые методы для делегирования. В лиспе, если мне надо пробросить аргументы, не разбираясь в них, я пишу

(defun f (&rest l)
  (apply #'insert *w* l)
  )
Можно ли сделать такое же в tcl? Я пока так делаю:
proc f args {
  eval .w insert $args
}
Здесь есть &rest, но нет apply. Будет ли работать тот кусок, который я написал, правильно при всех аргументах? У меня тут нет ясного понимания, как tcl себя ведёт, но боюсь, что это мне пока просто везло. Можно ли здесь обойтись без eval?

★★★★★

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

Гранд мерси вам, милостивые судари! Пошёл искать в коде eval-ы с целью изничтожения.

den73 ★★★★★
() автор топика

Можно ли здесь обойтись без eval?
eval .w insert $args

.w — это listbox?

я без eval не осилил

 listbox .t$x.lbox1
 eval ".t$x.lbox1 insert 0 [dict keys $materials]"
 .t$x.lbox1 configure -height 0

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

Может, я тоже не осилил, но я об этом пока не знаю. Реальный код вот:

package require snit

namespace eval ::clcon_text {
    ::snit::widgetadaptor clcon_text {
        option -readonly -default 0
        option -send_to_lisp -default 0
        constructor {args} {
            installhull using text
            $self configurelist $args
        }
        method insert {args} {
            if {![$self cget -readonly]} {
                $self RoInsert {*}$args
            }
        }
        method delete {args} {
            if {![$self cget -readonly]} {
                $self RoDelete {*}$args
            }
        }
        method replace {args} {
            if {![$self cget -readonly]} {
                $self RoReplace {*}$args
            }
        }
        method RoInsert {args} {
            set result [$hull insert {*}$args]
            if {[$self cget -send_to_lisp]} {
                puts "Sending to lisp: i $args"                    
            }
            return $result
        }
        method RoDelete {args} {
            set result [$hull delete {*}$args]
            if {[$self cget -send_to_lisp]} {
                puts "Sending to lisp: d $args"
            }
            return $result
        }
        method RoReplace {args} {
            set result [$hull replace {*}$args]
            if {[$self cget -send_to_lisp]} {
                puts "Sending to lisp: r $args"
            }
            return $result
        }
        delegate method * to hull
        delegate option * to hull
    }


}
    
######################## Example ################################

#  # Initialization (readonly set to 1)
# ::clcon_text::clcon_text .text -readonly 1
#  # Changing readonly after creation
# .text configure -readonly 0
# .text configure -readonly 1
    
# .text insert 0.0 "this line will be ignored"

# for {set x 0} {$x<10} {incr x} { 
#     .text RoInsert end "line $x\n"
# }

# ::clcon_text::clcon_text .text2
# .text2 insert end "Line inserted by 'insert'\n"
# .text2 RoInsert end "Line inserted by 'RoInsert'\n"

# pack .text   -side top
# pack .text2 -side bottom

den73 ★★★★★
() автор топика

с такими темпами вы скоро поймёте, что лисп уже ненужен :-)

ps/ зато забрезжит IDE для tcl/tk :-) что в свете активного использования tkinter в python&ruby более актуально

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

Я пишу на Tcl/Tk и Common Lisp около шести лет, и авторитетно заявляю, что лисп не нужен только когда дело касается графических интерфейсов. Печально, конечно, учитывая существование CLIM, но это так.

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

На глазок правильно. Разве что можно вместо [$self cget -send_to_lisp] делать $options(-send_to_lisp). options - это *изменяемый* массив содержащий все опции данного виджета, без опций его hull.

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

да, так я и сделал еще вчера

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

Я пишу на Tcl/Tk и Common Lisp около шести лет,
лисп не нужен только когда дело касается графических интерфейсов.
Печально, конечно, учитывая существование CLIM,

А умозрительный бэкенд mcclim-tk - рассматриваешь за вариант?

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

У меня в самодельной учетке был такой недоделаный вариант. Запускал пару демок из McCLIM-а. При определенной сосредоточености его можно выделить. Вот с месяц смотрю на него - думаю. Сколько еще человек в штуках знает этот свмый CLIM. А вариант с не самым молодежным еще добавляет сомнений.

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

У CLIM то главная проблема - в недостатке документации и отсутствии допиленных до конца свободных реализаций. Если бы хоть одна была документирована, с референсами и туториалами, объяснением почему оно лучше традиционных гуёв, и всё работало и не падало в самых неожиданных местах, то пофиг что там в бэкенде.

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

и не падало в самых неожиданных местах,

В каких не помнишь? Я сразу только про DnD могу вспомнить.

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

хоть одна была документирована
с референсами и туториалами,
объяснением почему оно лучше традиционных гуёв,
и всё работало

Это про какой-то совсем уж кисельно-молочный вариант. Который я не потяну. У меня интерес был более приземленный. Нсколько тебя CLIM еще интересует именно в плане практического применения. Пусть пока с багами. Которых по идее не может не быть.

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

Хорошо, когда понадобится гуй, я не буду сразу делать на Tcl/Tk, а спрошу у Вас насчёт CLIM.

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