小编car*_*rem的帖子

目标C; typedef objc_object作为没有指针的id的替代;

在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的误解是什么?

typedef objective-c

5
推荐指数
1
解决办法
1984
查看次数

如何获取当前正在执行的函数的限定名称?

Python 3.3 引入了__qualname__函数对象和类对象的属性。

获取当前执行函数的(非限定)名称和代码对象很容易。

但是如何获取当前正在执行的函数的限定名称呢?

python-3.x

5
推荐指数
1
解决办法
330
查看次数

宏将计算出的绑定列表提供给“让”?

我正在为宏 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)

macros common-lisp

2
推荐指数
1
解决办法
558
查看次数

python访问在派生类中重新定义的属性

我对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表示法访问此属性,或者您可能无法访问该属性完全访问它.

这是真的吗?如果是这样它会杀死 …

python python-3.x

0
推荐指数
1
解决办法
308
查看次数

标签 统计

python-3.x ×2

common-lisp ×1

macros ×1

objective-c ×1

python ×1

typedef ×1