小编der*_*fed的帖子

如何在Common Lisp中拼接到宏外的列表?

说我有一个函数foo:

(defun foo (x y &rest args) ...)

后来我想用功能栏包装它:

(defun bar (x &rest args) (foo x 100 args))

假设bar然后被调用如下: (bar 50 1 2 3)

使用这个设置,args是一个包含尾随参数的bar体内的列表,因此当我将它传递给foo时,而不是得到相当于(foo 50 100 1 2 3)我的(foo 50 100 '(1 2 3)).如果这些是宏,我会在条形体内使用``(foo,x 100,@ args)`将args拼接到函数调用中.但是,@只能在反引号列表中使用.

如何在常规函数中进行相同类型的拼接?

common-lisp

18
推荐指数
1
解决办法
3458
查看次数

在使用ELPA安装后,如何在Emacs中设置Clojure类路径?

我正在尝试使用ELPA在Emacs中设置的Clojure REPL中添加路径到我的类路径.显然,这不是$ CLASSPATH环境变量,而是Swank设置的swank-clojure-classpath变量.因为我使用ELPA来安装Swank,Clojure等,所以有大量的.el文件可以处理所有内容,而不是我的.emacs文件.不幸的是,我现在无法弄清楚如何更改类路径.

我尝试在我的.emacs中使用ELPA之前和之后的(setq'swank-clojure-extra-classpaths(list ...)),并且我尝试将路径直接添加到swank-clojure-classpath中. emacs,.emacs.d/init.el和.emacs.d/user/user.el,但没有任何作用.

我最终要做的是添加当前目录"." 以及我保留Clojure程序的目录.我假设swank-clojure-classpath是我需要在这里设置的东西.谢谢你的帮助.

emacs clojure classpath elpa

9
推荐指数
1
解决办法
2114
查看次数

存储接口实现和检索特定实现的好模式是什么?

我正在编写一个模拟器,它有几个接口,所有模拟对象都可以实现.所述Entity接口具有所有的对象必须有方法,如ID检索和提前用于所述对象的状态的时间的步骤.Collidable扩展Entity,并表示在碰撞检测算法运行时应考虑的具有体积和位置的任何内容.Fieldextends Entity,并表示将位置映射到值的任何内容; 这些用于模拟诸如渗透到世界但没有体积或物理形式的磁场之类的东西.RigidBody是一个实现Collidable并提供刚体动力学算法的类.我有一个World管理所有的类,Entities并有方法推进模拟器的时钟和分区世界,以使碰撞检测更有效.

我的问题涉及Entity从中检索子类型World.最初,World只是有一个Entities由ID键入的地图,并且要解除一个Field或者RigidBody有一些方法可以抓住Entity地图并进行instanceof检查以及对所需子类型进行强制转换.我很清楚这种instanceof用法是不受欢迎的,所以我尝试了另一种方法.

目前,我在World每个界面都有单独的地图.例如,Collidables所有人都有地图和地图Entities.该addCollidable()方法将添加到两个地图,并将getCollidable()仅从Collidable地图中检索.这避免了instanceof,但对我来说它似乎仍然是糟糕的设计.如果我梦想扩展另一个接口Entity,我将需要另一个地图World和相应的方法.

我觉得这个问题并不是非常模糊,所以在这种情况下通常会做什么?

编辑

我不相信访问者模式在这里可行,因为访问者允许您调度具体类型,并且我的一些检索方法需要检索接口类型.例如,如果World只需要检索所需的方法RigidBodies和其他类似的具体类,则访问者将工作,但我无法创建一个方法来检索所有Collidables访问者.

java simulation interface subclass

9
推荐指数
1
解决办法
238
查看次数

您如何使用 Google API getRequestHeaders() 获取 OAuth2 访问令牌?

我正在使用googleapisnpm 库授权使用 OAuth2 访问我的 Gmail 帐户以发送电子邮件。我正在使用以下代码(TypeScript)来做到这一点:

const oAuth2Client = new google.auth.OAuth2(
  googleConfig.clientId,
  googleConfig.clientSecret
);

oAuth2Client.setCredentials({
  refresh_token: googleConfig.refreshToken
});

const accessTokenRetVal = (await oAuth2Client.refreshAccessToken()).credentials.access_token;
const accessToken = accessTokenRetVal || '';
Run Code Online (Sandbox Code Playgroud)

此代码有效,但我收到以下消息:

(node:8676) [google-auth-library:DEP007] DeprecationWarning: The `refreshAccessToken` method has been deprecated, and will be removed in the 3.0 release of google-auth-library. Please use the `getRequestHeaders` method instead.
Run Code Online (Sandbox Code Playgroud)

我在 Google、GitHubgoogleapis和 StackOverflow上搜索过该模块,但找不到任何有关该getRequestHeaders方法构成的文档。我试过调用getRequestHeaders,但它似乎没有返回credentials带有访问令牌的对象。

是否有关于getRequestHeaders在这种情况下应该如何使用的官方文档?

google-api-nodejs-client google-auth-library

9
推荐指数
2
解决办法
2861
查看次数