Objective-C 的 REPL

20

Objective-C有没有REPL?

我正在学习Objective-C,从Python的背景出发,非常想要有一个REPL。

6个回答

9

F-Script提供了一个类Smalltalk的REPL,用于Cocoa开发;Nu提供了基于Lisp的REPL。看起来F-Script更加完善,并提供了对象浏览器。

它们似乎都是针对OS X而不是iOS开发的。有些散落在论坛和博客上的文章描述了人们使用Nu开发iOS应用程序,但他们都是大约两年前的。还有一个YouTube视频,“使用Scheme REPL实时调试iPhone应用程序”,其中显示了一个人使用Scheme来调试iPhone应用程序。

我没有尝试过这些技术,但我很想听听那些试过的人的经验。


我刚意识到有一个更简单的答案。如果你来自Python,并想在REPL中尝试Cocoa,则应该使用Python REPL。OS X附带有用于将Python转换为Objective-C的桥接器。只需运行Python,执行import objc即可。还有其他一些语言的桥接器,例如Ruby和Common Lisp。

当然,所有这些REPLs只允许您编写动态代码以与Cocoa进行交互,但它们不允许您编写实际的Objective-C代码,并在运行时或动态地将其编译以与其进行交互。因此,没有一个真正满足您最初的要求。


Python 2.7 使用 Jupyter Notebook,'import objc' 失败。苹果网址显示页面未找到。 - AnneTheAgile
1
好的观点。在过去的五年中,我认为苹果放弃了对Objective-C桥的支持。此时,与Cocoa交互的最佳方式是使用Swift。只需运行“swift”。我不知道有什么好的Objective-C替代品。 - algal
我找到了CoderPad,看看我的新答案。 - AnneTheAgile
Objective-C桥仍然存在于JXA和AppleScript中。 - Sancarn

4
当断点触发时,调试器应该弹出。在调试器中,您可以键入任何您想要的内容到gdb中。您可以使用p [someObj someMethod] 对于在断点范围内的事物进行打印输出。gdb是一个强大的实用程序,在网上有很好的文档记录。
这将是您所需的最接近的结果。在编译语言中执行此操作会更加繁琐,因为Objective-C中没有eval

2
你不能在调试器中声明和/或分配新变量,对吧?你只能检查/修改现有的变量。 - d11wtq
可以的。 - Alex Brown
你也可以使用lldb命令“expr”,它允许赋值。 - Alex Brown

3
据我所知,目前最接近 REPL 的方式是通过调试器(即 GDB 或 LLVM 调试器 LLDB)。
对于纯 C,可以使用 CCons
苹果的 Objective-C API 中的大多数内容(特别是 Foundation)也有直接的 C 等效项(例如 CFRelease(obj); 相当于 [obj release];),您可以在 CCons 中使用。
CCons 是基于 LLVM 和 Clang 构建的,它们也支持 Objective-C。可能可以扩展 CCons 以支持 Objective-C。

1
CoderPad的“试用版”提供了一个面向公众的仅自用的REPL,支持无数种语言,包括Objective-C!!!我刚刚使用过它,对他们来说真是一个好的销售工具(我与他们没有关联;他们为面试编程人员提供工具)。https://coderpad.io/

0

是的,REPL在输出窗口中。

“打印对象”

po object

同时还能够执行作为应用程序代码运行的命令

expression i = 5

阅读这篇有趣的完整调试文章以获取更多信息。


0
Gambit Objective-C 项目中,似乎有一个创建基于 Scheme 的 REPL 的尝试。 Ruby Motion 中的 REPL 也应该很适合探索性目的(虽然我自己还没有尝试过)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接