Squeak Smalltalk-如何使;谈话内容";打印更多的东西?

Squeak Smalltalk-如何使;谈话内容";打印更多的东西?,smalltalk,squeak,Smalltalk,Squeak,我正在使用Smalltalk在成绩单窗口中键入1-9乘法表 这是我的代码: 1 to: 9 do: [:i| 1 to: i do: [:j| Transcript show: j. Transcript show: ' * '. Transcript show: i. Transcript show: ' = '. Transcript show: j * i. Transcript sho

我正在使用Smalltalk在成绩单窗口中键入1-9乘法表

这是我的代码:

1 to: 9 do: [:i|
    1 to: i do: [:j|
        Transcript show: j.
        Transcript show: ' * '.
        Transcript show: i.
        Transcript show: ' = '.
        Transcript show: j * i.
        Transcript show: '  '.
        ].
    Transcript show: ' '; cr.
    ].
可以看出,上面的代码虽然工作得很好,但看起来远远不够漂亮和简洁

我曾希望写一些类似的东西:

Transcript show: j '*' i '=' j * i.
不幸的是,他们错了。我记得C有一个很好的方法来处理我的问题

比如,
printf(“%d*%d=%d”,j,i,j*i)

在这种情况下,有没有更优雅的方法让Smalltalk代码变得优雅


彼得解决了这个问题。谢谢

更多问题:

1 to: 9 do: [:i|
    1 to: i do: [:j|
        Transcript show: j.
        Transcript show: ' * '.
        Transcript show: i.
        Transcript show: ' = '.
        Transcript show: j * i.
        Transcript show: '  '.
        ].
    Transcript show: ' '; cr.
    ].
如何在Smalltalk中显示“转义字符”

我知道在C中,
printf(“%d*%d=%d\n”,j,I,j*I)似乎很好

但是在Smalltalk中,
Transcript show:({1}*{2}={3}cr.“格式:{i.j.i*j})。
不好


我该如何解决这个问题呢?

我建议进行两项修改:

  • 让代码与通用的
    流一起工作
    ,并将其与
    转录本一起使用

    dumpTableOn: aStream
       <your code here>
    
  • 将代码分为两种方法

    dumpTableOn: aStream
      1 to: 9 do: [:i | 
        1 to: i do: [:j |
            self dump: i times: j on: aStream.
            aStream space].
        aStream cr]
    
    
    dump: i times: j on: aStream
      aStream
        nextPutAll: j asString;
        nextPutAll: ' * ';
        nextPutAll: i asString;
        nextPutAll: ' = ';
        nextPutAll: (j * i) asString
    

  • 下面是上述方法的一个不太详细的版本

        dump: i times: j on: aStream
          aStream
            print: j;
            print: ' * ';
            print: i;
            print: ' = ';
            print: j * i
    
    请注意,
    #print:
    不要求我们首先将参数转换为
    字符串

    还请注意,级联不会创建中间的
    字符串
    ,而表达式

    j asString, '*', i asString, '=', (j*i) asString
    

    创建4个中间字符串(每个
    #,
    一个)。这没什么大不了的,只是我们不会充分利用
    流协议,它的全部目的是让客户端不再需要连接它这边的东西。

    我建议两个更改:

  • 让代码与通用的
    流一起工作
    ,并将其与
    转录本一起使用

    dumpTableOn: aStream
       <your code here>
    
  • 将代码分为两种方法

    dumpTableOn: aStream
      1 to: 9 do: [:i | 
        1 to: i do: [:j |
            self dump: i times: j on: aStream.
            aStream space].
        aStream cr]
    
    
    dump: i times: j on: aStream
      aStream
        nextPutAll: j asString;
        nextPutAll: ' * ';
        nextPutAll: i asString;
        nextPutAll: ' = ';
        nextPutAll: (j * i) asString
    

  • 下面是上述方法的一个不太详细的版本

        dump: i times: j on: aStream
          aStream
            print: j;
            print: ' * ';
            print: i;
            print: ' = ';
            print: j * i
    
    请注意,
    #print:
    不要求我们首先将参数转换为
    字符串

    还请注意,级联不会创建中间的
    字符串
    ,而表达式

    j asString, '*', i asString, '=', (j*i) asString
    
    创建4个中间字符串(每个
    #,
    一个)。这没什么大不了的,只是我们不会充分利用
    协议,该协议的全部目的是将客户端从连接其自身事物的需要中解放出来。

    字符串扩展 比如printf(“%d*%d=%d”,j,i,j*i)

    有一些格式化选项,但没有任何可与printf(afaik)相比的选项

    更新:转义字符 字符串中没有转义字符,唯一的例外是单引号('),可以通过将其加倍(“代码>'s double!”)来“转义”。

    要写新行或制表符,您可以

  • 在字符串中键入它

    a:='two
    行。
    (请注意,StackOverflow将选项卡替换为空格:/)

  • 连接字符串

    b:=“两行”,字符串cr,字符串选项卡,“行”。

  • 告诉write stream添加它

    c:=字符串streamContents:[:流|流字符串扩展
    比如printf(“%d*%d=%d”,j,i,j*i)

    有一些格式化选项,但没有任何可与printf(afaik)相比的选项

    更新:转义字符 字符串中没有转义字符,唯一的例外是单引号('),可以通过将其加倍(“代码>'s double!”)来“转义”。

    要写新行或制表符,您可以

  • 在字符串中键入它

    a:='two
    行。
    (请注意,StackOverflow将选项卡替换为空格:/)

  • 连接字符串

    b:=“两行”,字符串cr,字符串选项卡,“行”。

  • 告诉write stream添加它


    c:=String streamContents:[:stream | stream如果您喜欢使用类似于
    printf
    的东西,Squeak有expandMacroWith:方法家族(浏览类字符串)

    您的示例可以写成:

    1 to: 9 do: [:i|
        1 to: i do: [:j|
            Transcript show: ('<1p> * <2p> = <3p>   ' expandMacrosWith: j with: i with: j*i)
            ].
        Transcript show: ' '; cr.
        ].
    

    如果您喜欢使用类似于
    printf
    ,Squeak有expandMacrosWith:方法家族(浏览类字符串)

    您的示例可以写成:

    1 to: 9 do: [:i|
        1 to: i do: [:j|
            Transcript show: ('<1p> * <2p> = <3p>   ' expandMacrosWith: j with: i with: j*i)
            ].
        Transcript show: ' '; cr.
        ].
    

    还请注意,这意味着一个重要的变化:从工作区中的“松散”脚本到类中的方法。这是Smalltalk中的一个相关步骤,因为创建一个类来解决问题是探索领域和获取知识的第一步。还请注意,这意味着一个重要的变化:从“松散”到工作区中的脚本,类中的方法。这是Smalltalk中的一个相关步骤,因为创建一个类来攻击问题是探索域和获取知识的第一步。谢谢。这解决了我的问题。忘记问了。如何在Smalltalk中显示“转义字符”。我知道C,printf(“%d*%d=%d\n”,j,I,j*I);似乎很好。但在Smalltalk中,文本显示:({1}*{2}={3}cr.格式:{i.j.i*j})。不好。我怎么解决这个问题?谢谢。这解决了我的问题。忘了问。如何在Smalltalk中显示“转义字符”。我知道C,printf(%d*%d=%d\n),j,i,j*i);似乎很好。但在Smalltalk中,文本显示:({1}*{2}={3}cr.格式:{i.j.i*j})。不好。我如何解决这个问题?