在Objective-C中,id是一个typedef:
typedef struct objc_object {
Class isa;
} *id;
Run Code Online (Sandbox Code Playgroud)
所以我可以声明(并初始化)一个变量,例如:
// using id
id po_one = @"one";
Run Code Online (Sandbox Code Playgroud)
编译好.
因为我在自己的方案中命名我的类型,因为我不喜欢id typedef中的隐含指针,我想添加一个自己的typedef(对象为O),如下所示:
typedef struct objc_object O;
Run Code Online (Sandbox Code Playgroud)
所以变量声明(带初始化)可能如下所示:
// using O
O * po_two = @"two";
Run Code Online (Sandbox Code Playgroud)
这会编译一个警告:
从不兼容的指针类型初始化
据我所知,typedef我认为后者应该相当于:
// using struct objc_object
struct objc_object * po_three = @"three";
Run Code Online (Sandbox Code Playgroud)
这再次编译好.
令人惊讶的是:
po_two = po_one;
po_two = po_three;
Run Code Online (Sandbox Code Playgroud)
两者都编译没有警告.
所以我尝试过:
typedef struct objc_object * PO;
Run Code Online (Sandbox Code Playgroud)
如果我包含指针(完全是我想要避免的东西 - 因此只是出于测试原因),看看它是否在没有警告的情况下工作,以查看结构定义之外的typedef是否与结构定义中的typedef不同(这是在这种情况下id的定义).
// using PO
PO po_four = @"four";
Run Code Online (Sandbox Code Playgroud)
这也很好.
如果我使用:
#define O struct objc_object
Run Code Online (Sandbox Code Playgroud)
使用O的构造在没有警告的情况下再次编译.
但我更喜欢尽可能使用typedef而不是定义.
我很困惑.我对typedef的误解是什么?
Python 3.3 引入了__qualname__函数对象和类对象的属性。
获取当前执行函数的(非限定)名称和代码对象很容易。
但是如何获取当前正在执行的函数的限定名称呢?
我正在为宏 lambda 列表尝试不同的绑定模型。
编辑:事实上,我的测试宏的 lambda 列表总是(&rest ...). 这意味着我正在“解构”参数列表而不是 lambda 列表。我尝试获得一个解决方案,该解决方案适用于将 optional 与关键参数或 rest/body 与关键参数相结合——这两种组合在 Common Lisp 标准实现中都不起作用。
所以我有不同的函数给我一个绑定列表,这些绑定的语法与“let”使用的语法相同。
例如:
(build-bindings ...) => ((first 1) middle (last "three"))
Run Code Online (Sandbox Code Playgroud)
现在我想在我的测试宏中使用一个简单的宏,将这样的列表提供给“让”。
如果我有一个文字列表,这很简单:
(defmacro let-list (_list &rest _body)
`(let ,_list ,@_body))
(let-list ((a 236)) a) => 236
Run Code Online (Sandbox Code Playgroud)
但这与简单的“让”相同。
我想要的与生成的列表相同。
所以例如
(let-list (build-bindings ...)
(format t "first: ~s~%" first)
last)
Run Code Online (Sandbox Code Playgroud)
with (build-bindings ...),在与调用相同的词法范围内求值(let-list ...),返回
((first 1) middle (last "three"))
Run Code Online (Sandbox Code Playgroud)
宏的扩展应该是
(let
((first 1) middle (last "three"))
(format t "first: ~s~%" …Run Code Online (Sandbox Code Playgroud) 我对python感到困惑,我越是陷入困境.
例如,以下代码:
class A:
def __init__ (self):
self.test = "a"
def dump(self):
print("A.test: %s" % (self.test,))
print("A.test: %s" % (self.__dict__["test"],))
print("A.test: %s" % (getattr(self, "test"),))
print()
class B (A):
def __init__ (self):
self.test = "b"
def dump(self):
print("B.test: %s" % (self.test,))
print("B.test: %s" % (self.__dict__["test"],))
print("B.test: %s" % (getattr(self, "test"),))
print()
o = B ()
o.dump()
A.dump(o)
super(B, o).dump()
Run Code Online (Sandbox Code Playgroud)
打印:
B.test: b
B.test: b
B.test: b
A.test: b
A.test: b
A.test: b
A.test: b
A.test: b
A.test: b
Run Code Online (Sandbox Code Playgroud)
这似乎表明您可以调用基类的函数,但如果该类具有某个派生类中也使用的属性,则无法使用普通的object.attribute表示法访问此属性,或者您可能无法访问该属性完全访问它.
这是真的吗?如果是这样它会杀死 …