错误:无法读取服务器:远程使用 ltk 时没有此类变量

2023-12-08

我正在摆弄ltk因为它提供了运行远程 GUI 的选项。但是,当尝试使用远程 GUI 时,我遇到了在本地运行 ltk 时不会遇到的问题:

(in-package :ltk-user)


(defun add-current-investigation-frame (master)
  (let* ((frame (make-instance 'frame :master master :width 100 :height 100))
         (topic-label (make-instance 'label :text "Current Investigation" :master frame))
         (project-label (make-instance 'entry :text "N/A" :master frame))
         (action-button (make-instance 'button
                                       :master frame
                                       :text "new investigation")))
    (setf (command action-button) (lambda ()
                                    (format t "test~%")
                                    (let ((next-project (nth (random 3) '("A" "B" "N/A"))))
                                      (setf (text project-label) next-project))))
    (pack frame)
    (pack topic-label :side :top)
    (pack project-label :side :top)
    (pack action-button :side :top)))



(defun create-main-view ()
  (let ((wrapper-frame (make-instance 'frame :master nil)))
    (pack wrapper-frame)
    (add-current-investigation-frame wrapper-frame)))


(defun create-remote-view (&optional (port 8888))
  (Ltk:with-remote-ltk port ()
                       (create-main-view)))


(defun create-local-view ()
  (with-ltk ()
    (create-main-view)))

跑步时(create-local-view)一切正常,条目小部件的内容随机变化。

跑步时(create-remote-view)我收到错误消息can't read server: no such variable. 为什么会出现此错误以及如何修复此错误?

我正在使用remote.tcl由 Quicklisp 部署:

#!/usr/bin/wish

#    This library is free software; you can redistribute it and/or
#    modify it under the terms of the GNU Lesser General Public
#    License as published by the Free Software Foundation; either
#    version 2.1 of the License, or (at your option) any later version.
#
#    This library is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#    Lesser General Public License for more details.

#    You should have received a copy of the GNU Lesser General Public
#    License along with this library; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


wm withdraw .
set host localhost
if {[llength $argv] == 2} {
    set host [lindex $argv 0]
    set port [lindex $argv 1]} else {
        set port [lindex $argv 0]}
#puts "connecting to $host $port"

set server [socket $host $port]
set wi [open "|wish" RDWR]
fconfigure $server -blocking 0
fconfigure $wi -blocking 0


fileevent $server readable {set txt [read $server];puts $wi "$txt";flush $wi}
fileevent $wi readable {
    if {[eof $wi]} {
        close $wi
        exit} else {        
            set txt [read $wi]; puts -nonewline $server $txt;flush $server}}

所以我花了一些时间阅读和测试代码,看起来它与remote-client.tcl than remote.tcl。当与ltk-remote.lisp,Lisp 端创建一个可以接受多个客户端的服务器,每个客户端都是一个 tcl/tk 解释器。

    lisp <=== socket stream ===> [ server socket ]
                                        ^
                                        |
                                 (wish interpreter)

Lisp 端期望解释器维护一个名为server。对于本地口译员,这是在init-wish,哪里有set server stdout。在远程愿望的情况下,希望愿望解释器自己设置该变量。

情况就是这样remote-client.tcl,并且测试应用程序运行良好(例如ltk-remote::lrtest),除了它添加了一个.status永远不会被删除的小部件。应该可以清理一下remote-client.tcl script.

如果是remote.tcl, 口译员opens一对流到另一个流wish过程:

set wi [open "|wish" RDWR]

它还连接到服务器(变量server),并将输入从服务器复制到愿望进程。不幸的是,嵌入的愿望过程没有定义server多变的:

    lisp <=== socket stream ===> [ server socket ]
                                        ^
                                        |
                                 (wish interpreter 1)
                                     "server" variable
                                        |
                                       "wi" variable
                                        ^
                                        | pipe connection
                                        v
                                 (wish interpreter 2) 
                                 no "server" variable
                                        

但是如果你设置server to stdout,正如另一个答案中所解释的,该作业在第二个愿望解释器中进行评估。输出被发送回第一个 Wish 解释器,该解释器将答案复制回 Lisp 服务器。

我没有通过另一个愿望解释器,而是使用修改后的本地测试remote-client.tcl不添加任何小部件:

package require Tk

set host localhost
set port 19790
set server ""

if {[llength $argv] > 0} {
    set host [lindex $argv 0]
}

if {[llength $argv] > 1} {
    set port [lindex $argv 1]
}

if {[catch {global server; global host; global port; set server [socket $host $port]}]} {
    tk_messageBox -icon error -type ok -title "Connection failed!" -message "Cannot connect to server $host port $port."
    exit
}

fconfigure $server -blocking 0 -translation binary -encoding utf-8
fileevent $server readable [list sread $server]

set buffer ""

proc getcount {s} { 
    if {[regexp {^\s*(\d+) } $s match num]} {
        return $num
    }
}

proc getstring {s} { 
    if {[regexp {^\s*(\d+) } $s match]} {
        return [string range $s [string length $match] end]
    }
}

proc process_buffer {} {
    global buffer
    global server

    set count [getcount $buffer]
    set tmp_buf [getstring $buffer]

    while {($count > 0) && ([string length $tmp_buf] >= $count)} {
        set cmd [string range $tmp_buf 0 $count]
        set buffer [string range $tmp_buf [expr $count+1] end]

        if {[catch $cmd result]>0} {
            tk_messageBox -icon error -type ok -title "Error!" -message $result
            puts $server "(error: \"$result\")"
            flush $server
            close $server
            exit
        }
        set count [getcount $buffer]
        set tmp_buf [getstring $buffer]
    }
}

proc sread {server} {
    global buffer
    if {[eof $server]} {
        tk_messageBox -icon info -type ok -title "Connection closed" -message "The connection has been closed by the server."
        close $server
        exit
    } else {
        set txt [read $server];
        set buffer "$buffer$txt"
        process_buffer
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

错误:无法读取服务器:远程使用 ltk 时没有此类变量 的相关文章

  • 如何访问 cl-json 从 JSON 解码的对象?

    我正在尝试在 Common Lisp 中导入 JSON 我想出了如何从 JSON 字符串解码对象 但我不知道如何访问返回的对象的属性 要解码字符串 并将结果存储在 tempjson 中 我这样做 defun test json with i
  • 在 Lparallel 库中使用队列 (Common Lisp)

    lparallel 库中队列的基本讨论位于https z0ltan wordpress com 2016 09 09 basic concurrency and parallelism in common lisp part 4a para
  • Common Lisp:如何使用条件拼接在宏中构建列表?

    我们假设 defmacro testing optional var list this is when consp var a list 当被调用时 gt testing 2 THIS IS gt testing list 1 2 THI
  • 为什么 Common Lisp 中冒号位于变量之前

    Common Lisp 中变量前面的冒号语法是什么意思 我见过这样的程序 我将在这里从大量函数中展示一些示例代码 defun expand successorf node mapcar lambda action state cost le
  • SBCL:将 Hunchentoot 应用程序部署为可执行文件

    我开始使用 SBCL Common Lisp 并希望使用 Hunchentoot 开发一个小型 Web 应用程序 为了便于部署 我计划使用 sb ext save lisp and die 将所有内容保存在二进制文件中 因为我可以忍受大输出
  • LISP:关键字参数,提供-p

    目前我正在学习 Peter Seibel 的 Practical Common Lisp 在 实用 一个简单的数据库 一章中 http www gigamonkeys com book practical a simple database
  • Jupyter 和 Common Lisp

    我正在尝试安装cl jupyter https github com fredokun cl jupyter common lisp 内核Jupyter http jupyter org 我无法让它工作 当我打开一个新的 lisp 笔记本
  • Common Lisp 中重置状态

    新手 Common Lisp 问题在这里 有没有办法重置环境状态 我的意思是 是否有一些命令可以使 REPL 恢复到启动后的相同状态 即取消所有变量 函数等 或者如果这不在 Common Lisp 标准中 是否有一些扩展在 SBCL 我使用
  • 使用包阴影符号

    例如 我有这个包定义 它遮蔽了 COMMON LISP LISTEN defpackage shadows use common lisp shadow listen export listen 然后我想使用另一个包中的这个包 比如说 de
  • 在我的 Linux 机器上安装 lisp

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • 在 Common Lisp 中编写 Lambda 表达式

    我目前正在阅读 Paul Graham 的 ANSI Common Lisp 并且有一个关于编写 lambda 表达式的问题 我们是否需要在 lambda 表达式前面加上前缀 如果我在 REPL 中写这样的东西 它会工作得很好 gt lam
  • 修改功能;保存到 Lisp 中的新函数

    所以我认为 lisp 在其他语言中 的优点之一是它能够实现函数工厂 接受函数作为参数 返回新函数 我想使用此功能对函数进行小的更改并将其保存为新函数 这样如果对原始函数进行更改 它们也会反映在它所基于的新函数中 注意 我不是编写原始函数的人
  • 学习 LISP 的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何定义所有成员均为给定类型的列表

    我对 CL 类型系统有点陌生 但我认为像下面这样的东西可以工作 deftype list of type labels check all l every lambda item typep item type l and list sat
  • 使用 slime 时如何跳转到 emacs 中的函数定义?

    我已经使用安装了史莱姆https github com thephoeron slime pack https github com thephoeron slime pack并想进一步探索 common lisp 如何访问 emacs 中
  • 如何从 SBCL 解释器将特定函数写入文件?

    假设我在没有 SLIME 的情况下玩过 SBCL 没有任何简单的解释器 现在我想将几个函数保存在一个文件中 不是核心图像 只是文本形式的一些代码 我该怎么做呢 有两种方法可以做到这一点 使用DRIBBLE and or FUNCTION L
  • Lisp:CHAR 既未声明也未绑定

    几天前我决定学习 通用 Lisp 我意识到这是一个相当新手的问题 对于至少有一点经验的人来说可能非常微不足道 所以基本上发生的事情是我加载 Emacs Slime 通过 Lisp in a Box 并编写我的程序 包括在下面 defun l
  • defvar、defparameter、setf 和 setq 之间有什么区别

    我找到了一个类似问题 https stackoverflow com questions 3855862 setq and defvar in lisp 但我不太明白这个解释 所以我尝试使用以下示例运行 clisp 1 gt defvar
  • 如何指定 sbcl(或 common lisp)向量中的元素类型?

    我尝试在 sbcl 1 1 14 中执行以下代码 但类型检查似乎忽略了向量元素的声明 defun test vec declare type vector integer vec format nil a elt vec 0 有什么提示吗
  • 以表格形式连续调用/评估?

    大家好 简单的问题 使用 XLISP 编写程序 但我似乎遇到了一个我似乎无法解决的简单基本问题 也许有人有一个快速解决方案 我正在尝试编写一个 if 语句 该语句的 then 子句评估多种形式并返回最后一种形式的值 在示例中 setq PO

随机推荐

  • 无论你给它分配什么值,Python结构总是停留在0?

    我正在编写一个模块来压缩要传递给 C 程序的位 但不断出现错误 经过一些测试 我发现Blah类的a字段无论如何都停留在0 有谁知道这是一个错误还是我在这里做错了什么 抱歉 我忘了提及我正在使用 python 3 1 2http www py
  • 将单个文件从 NFS docker 卷挂载到容器中

    示例 为简洁起见 省略了许多选项 version 3 volumes traefik driver local driver opts type nfs o addr 192 168 1 100 soft rw nfsvers 4 asyn
  • 如何执行 jQuery 代码 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我有一个朋友给我的 jQuery 代码 我不知道如何让它工作 有人告诉我可以将其另存为
  • 如何在 MvxSpinner 中设置所选项目

    我有一个 MvxSpinner 绑定到List
  • 如何删除 df 命令中的标头?

    我正在尝试编写一个 bash 命令 该命令将按所有卷已使用和尝试使用的数据量对所有卷进行排序 df awk print 1 sort r k3 n Output map devfs Filesystem dev disk1s5 dev di
  • 整数序列的最佳压缩算法

    我有一个大数组 其中的整数范围大多是连续的 例如 1 100 110 160 等 所有整数都是正数 压缩这个的最佳算法是什么 我尝试了 deflate 算法 但只提供了 50 的压缩率 请注意 该算法不能是有损的 所有数字都是唯一的并且逐渐
  • 如何清除查询消息?

    如何清除查询中的消息缓冲区 实际上 我不想在查询完成后看到任何消息 考虑到这一点 我正在使用PRINT我的查询中的声明 我的查询也可能会打印一些带有 不带有的错误消息RAISEERROR 不 实际上没有办法隐藏自定义打印消息 你只能隐藏 受
  • 使用 http.Client 和 http.Transport 设置请求标头

    我有多个IP可以上网 我正在请求选择界面 在这种情况下我应该如何设置标题 tcpAddr net TCPAddr IP addrs 3 net IPNet IP Choosing ip address number 3 d net Dial
  • 返回一个Type,或者如何保存一个对象指针的类型?

    我有一个非常复杂的代码结构 但重要的部分是 典型设置 我有一个基类和两个从该基类派生的类 每个类都有自己的成员 并且没有标准构造函数 class BaseSolver class SolverA BaseSolver public std
  • 具有多值查询的 Spring 缓存抽象

    Spring Cache抽象是否支持多值查询 代替 Cacheable 书籍 公共图书 findBook ISBN isbn 想象一下这样的查询 Cacheable 书籍 公共列表 findBook 列表 isbns 支持吗 它会单独缓存集
  • 如何在异步回调中调用事件处理程序,以便在调用线程中运行

    我正在开发一个由不同应用程序使用的 VS 项目 解决方案 我的工作是重构项目并将其从使用 xxxAsync 方法更改为使用 BeginInvoke 我想出了类似于以下代码的内容 public class AsyncTestModel pri
  • 如何在 TFS 2015 的脚本中访问构建的自定义变量?

    在 Team Foundation Server 2015 的构建定义中 我使用在 变量 选项卡上定义的自定义变量 有没有什么方法可以在 PowerShell 构建步骤中访问它们 例如可以访问预定义变量 env BUILD DEFINITI
  • OpenCV 不适用于 Visual Studio

    我刚刚安装了 openCV 版本 我的计算机上有 3 00 beta 我正在尝试使用 VS2013 对其进行测试 我遵循快速入门指南 1 Windows 安装 使用预构建库 2 微软VS中的OpenCV 使用本地方法和x64 vc12库目录
  • git svn 在非标准 svn 存储库布局上指定分支和标签

    布局是 Branches Project1 Branch11 Branch1N Project2 Branch21 ProjectX not anywhere else Excluded1 Excluded2 Excluded3 Exclu
  • 为什么即使从未调用 TransactionScope.Complete() 也会提交嵌套事务?

    我正在测试嵌套事务如何工作 并发现了这种令人不安和意外的行为 using TransactionScope otx new TransactionScope using SqlConnection conn1 new SqlConnecti
  • 如何更新 Ionic Framework 中 Angular 的版本?

    我在使用 Angular 过滤器时遇到一些问题 每个人都说 是因为您没有使用 Angular 1 3 8 或更高版本 我只是通过执行以下操作来实现我的版本angular version在控制台上并且 Object full 1 3 6 ma
  • 将现有的 Android Studio 项目添加到 VSTS

    我有一个使用 Kotlin 在 Android Studio 中开发的现有 Android 项目 它尚未受到版本控制 我想将其添加到 Visual Studio Team Services 的新经典 TFVC 项目中 而不是 Git 项目中
  • 我可以通过 SQL Server 触发器调用 C# 函数吗?

    外部应用程序进入我的数据库以在 Sql 服务器表中插入行 我自己有一个网络应用程序 我想在这个表中的每个插入中 在服务器端进行一些处理 我的想法是在表上插入时创建一个触发器 然后调用适当的函数 做这个的最好方式是什么 我使用带有 LINQ
  • 允许读、写: if request.auth != null;

    我有这个警告 除非您更新安全规则 否则您的 Cloud Firestore 数据库将开始拒绝客户端请求 它说我有一天要改变它们 我对此不太了解 我尝试观看一些视频 但我无法理解 看到我可以更改日期 但更喜欢有适当的规则 到目前为止 我对我的
  • 错误:无法读取服务器:远程使用 ltk 时没有此类变量

    我正在摆弄ltk因为它提供了运行远程 GUI 的选项 但是 当尝试使用远程 GUI 时 我遇到了在本地运行 ltk 时不会遇到的问题 in package ltk user defun add current investigation f