输入字符串并将其打印回来的程序不会起作用

时间:2014-12-03 18:22:24

标签: printing lisp common-lisp

我觉得Common Lisp中的代码应该是一个非常简单的代码,我想要它做的就是要求用户输入,然后将其打印回来。

这是我的代码("之前""""打印是试图调试,它显示出奇怪的东西。

(defun get-input (prompt)
    (clear-input)
    (write-string prompt)
    (finish-output)
    (read-line)
)

(let    (   
            (p1 (get-input "Enter: "))
        )
    (princ "Before")
    (princ p1)
    (princ "After")
)    

当我运行时,我得到以下

This is SBCL 1.2.1, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.

WARNING: the Windows port is fragile, particularly for multithreaded
code.  Unfortunately, the development team currently lacks the time
and resources this platform demands.
* (load "test.lisp")

Enter: This is my string.
AftereThis is my string.
T

正如你所看到的,我的&#34;之前&#34;字符串甚至不打印,我的&#34; After&#34;字符串有一个奇怪的&#34; e&#34;到底?为什么我第一次运行程序时似乎要求输入?

如果有人能提供帮助,我将不胜感激。感谢

2 个答案:

答案 0 :(得分:2)

我相信这就是正在发生的事情,按顺序:

  1. 程序评估要绑定到p1的表达式;这会产生你的提示&amp;读取您的输入
  2. 然后打印“之前”
  3. 然后打印p1的值,我认为(最后)在末尾有一个回车符,以便下一个要打印的内容出现在行的开头
  4. 然后打印“After”,覆盖“Before”的前5个字符

答案 1 :(得分:0)

来自sam的其他信息:Windows下的SBCL。

嗯,是的。 SBCL的Windows端口非常粗糙。

请参阅输出中的警告:

  

警告:Windows端口易碎,特别是对于多线程   码。不幸的是,开发团队目前缺乏时间   和平台需要的资源。

SBCL来自Linux / Unix / ...世界。 Windows的端口做出的假设对Linux / Unix / ...有效,但不适用于Windows。

有一件事是线路终止。 Windows使用CRLF。 Unix使用LF。 Windows下的SBCL使用LF,IIRC。可能这可以以某种方式配置。

如果您现在在Windows下使用一个期望CRLF约定并使用LF约定使用SBCL创建直接输出的shell,那么您可能会得到奇怪的输出......

因此可能的解决方案是:

  • 使用支持Windows约定的Lisp。问题:没有多少。有很好的,比如LispWorks和Allegro CL,但它们相对昂贵。我不知道Clozure CL是如何做到的 - 它也可以在Windows下运行并且是免费的......

  • 了解如何配置SBCL以使用Windows I / O约定。 - &GT; SBCL邮件列表

  • 重新配置您的终端/ shell以使用Unix LF约定

我无法重现(Mac上终端中的CLISP和SBCL):

<强> CLISP

rjmba:~ joswig$ clisp
  i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
  I I I I I I I      8     8   8           8     8     o  8    8
  I  \ `+' /  I      8         8           8     8        8    8
   \  `-+-'  /       8         8           8      ooooo   8oooo
    `-__|__-'        8         8           8           8  8
        |            8     o   8           8     o     8  8
  ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8

Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/>

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2010

Type :h and hit Enter for context help.

[1]> (load "/tmp/g.lisp")
;; Loading file /tmp/g.lisp ...
Enter: hello
BeforehelloAfter
;; Loaded file /tmp/g.lisp
T
[2]> (quit)

<强> SBCL

rjmba:~ joswig$ sbcl
This is SBCL 1.1.16, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
* (load "/tmp/g.lisp")
Enter: hello
BeforehelloAfter
T

您可能想告诉我们您的具体实现和平台组合,以及Common Lisp输出的位置......