小编Seb*_* N.的帖子

如何开始使用monicello的git/github支持?

我最近读到git/github支持已被添加到Monticello.

我还看到一些在github上发布的Smalltalk项目.喜欢:

https://github.com/timfel/ratpack

我的问题:

  • 如何开始?
  • 为了从/向github加载/保存项目,我需要安装什么?

git version-control smalltalk github pharo

13
推荐指数
2
解决办法
647
查看次数

如果值不是nil,有条件地在Ruby中执行块?(又名Smalltalk的ifNotNilDo :)

在Smalltalk中有方法ifNotNilDo: 它使用如下:

database getUser ifNotNilDo: [:user | Mail sendTo: user ]
Run Code Online (Sandbox Code Playgroud)

在不nil执行块的对象上执行,将对象本身作为参数传递.类中的实现UndefinedObject(Smalltalk相当于Ruby的NilClass)实际上什么都不做.这样,如果让用户得到一个nil对象,就什么都不会发生.

我不知道Ruby有类似的东西,所以我推出了自己的解决方案.它是这样的:

class Object
  def not_nil
    yield(self)
  end
end

class NilClass
  def not_nil
    # do nothing
  end
end
Run Code Online (Sandbox Code Playgroud)

它可以像这样使用:

users = {:peter => "peter@peter.com", :roger => "roger@roger.com" }
users[:roger].not_nil {|u| Mail.send(u) }
Run Code Online (Sandbox Code Playgroud)

这使我们无法访问哈希两次

Mail.send(users[:roger]) if users[:roger]
Run Code Online (Sandbox Code Playgroud)

...或使用临时变量:

u = users[:roger]
Mail.send(u) if u
Run Code Online (Sandbox Code Playgroud)

更新:

人们开始建议基于哈希操作的解决方案,并且还要两次访问哈希.我的问题不是直接与哈希相关.

想象一下,第一个操作不是哈希访问,也很昂贵.喜欢:

RemoteUserRepo.find_user(:roger).not_nil {|u| Mail.send(u) }
Run Code Online (Sandbox Code Playgroud)

(结束更新)

我的问题是:

  • 重新发明这个成语我错了吗?
  • 在开箱即用的Ruby中是否支持这样(或更好)的东西?
  • 或者还有另一种更短,更优雅的方式吗?

ruby design-patterns smalltalk block

11
推荐指数
2
解决办法
2265
查看次数

为什么Smalltalk中的方法默认返回"self"?

背景

在Smalltalk中,如果您没有明确地返回任何内容,则传递的消息将评估为接收者(或消息上下文中的"self").

例如,给定此方法:

MyClass >> myMethod
  Transcript show: 'hello'; cr.
Run Code Online (Sandbox Code Playgroud)

评估(doint"print-it")这个:

| myInstance |
myInstance := MyClass new.
myInstance myMethod.
Run Code Online (Sandbox Code Playgroud)

如果对最后一次调用执行<print-it>,则结果将是实例本身.

问题

  • 为什么这样设计?
  • 它背后的想法是什么?
  • 哲学背景是什么?
  • 它有什么实际好处?方便链接是否方便?

oop smalltalk visualworks squeak pharo

10
推荐指数
4
解决办法
1553
查看次数

已经存在重试的功能方式 - 直到Scala?

是否有函数/ Scala方法重复调用函数,直到成功,同时对失败的尝试作出反应?

让我举一个例子来说明.假设我想从标准输入中读取一个整数,如果用户实际上没有输入整数,则重试.

鉴于此功能:

def read_int(): Either[String, Int] = {
  val str = scala.io.StdIn.readLine()
  try {
    Right(str.trim().toInt)
  } catch {
    case _: java.lang.NumberFormatException => Left(str)
  }
}
Run Code Online (Sandbox Code Playgroud)

而这个匿名函数:

val ask_for_int = () => {
  println("Please enter an Int:")
  read_int()
}

val handle_not_int = (s: String) => {
  println("That was not an Int! You typed: " + s)
}
Run Code Online (Sandbox Code Playgroud)

我会像这样使用它们:

val num = retry_until_right(ask_for_int)(handle_not_int)
println(s"Thanks! You entered: $num")
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • retry_until_rightScala中已存在类似的东西吗?
  • 可以用现有设施解决吗?(流,迭代器,Monad等)
  • 任何FP库(scalaz?)都提供这样的东西吗?
  • 我可以做更好/更惯用的事情吗?(*)

谢谢!

*)除了snake_case.我真的很喜欢

functional-programming scala scalaz

10
推荐指数
3
解决办法
2467
查看次数

为什么添加:返回Smalltalk集合中添加的对象?

背景

捕获每个Smalltalk新手的东西是add:不会返回"自我"但是添加的对象.

例如,使用此代码:

myCollection := OrderedCollection new 
  add: 'Peter';
  add: 'John';
  add: 'Paul'.
Run Code Online (Sandbox Code Playgroud)

myCollection将包含字符串"保罗",而不是集合本身.

这是因为add:返回正在添加的对象,整个级联表达式的计算结果是最后发送的消息.

相反,它应该写yourself在最后:

myCollection := OrderedCollection new 
  add: 'Peter';
  add: 'John';
  add: 'Paul';
  yourself.
Run Code Online (Sandbox Code Playgroud)

问题

  • 为什么会这样?
  • 这样设计的是什么?
  • add:这种行为有什么好处?

oop smalltalk visualworks squeak pharo

8
推荐指数
2
解决办法
375
查看次数

如果定义了选项,则用于在链中应用函数的惯用Scala

是否有预先存在/ Scala-idiomatic /更好的方法来实现这一目标?

def sum(x: Int, y: Int) = x + y

var x = 10
x = applyOrBypass(target=x, optValueToApply=Some(22), sum)
x = applyOrBypass(target=x, optValueToApply=None, sum)
println(x) // will be 32
Run Code Online (Sandbox Code Playgroud)

我的applyOrBypass可以像这样定义:

def applyOrBypass[A, B](target: A, optValueToApply: Option[B], func: (A, B) => A) = {
  optValueToApply map { valueToApply =>
    func(target, valueToApply)
  } getOrElse {
    target
  }
}
Run Code Online (Sandbox Code Playgroud)

基本上我想要应用操作,具体取决于是否定义了某些选项值.如果不是,我应该得到预先存在的价值.理想情况下,我想链接这些操作,而不必使用var.

我的直觉告诉我,折叠或减少会涉及到,但我不确定它是如何工作的.或者也许有另一种方法与monadic-fors ...

任何建议/提示赞赏!

monads coding-style scala optional-parameters named-parameters

7
推荐指数
2
解决办法
1717
查看次数

什么是特定于流程的变量?

我试图加载一个显然是为早期版本的Pharo编写的软件包(Ratpack,从http://ss3.gemstone.com/ss/RatPack.html进入Pharo 1.4).

在那里,我得到了关于environmentAt:put:不被支持的弃用警告Project.

根据文档,要使用的方法是使用ProcessSpecificVariable.

我的问题是:

  • 这些是什么?
  • 我该如何使用它们?
  • 如何将"旧"(已弃用)代码移植到这个新系统?

谢谢!

multithreading smalltalk pharo

6
推荐指数
1
解决办法
107
查看次数