我最近开始学习Common Lisp,并且(只是为了好玩)决定重命名lambda宏.
我的尝试是这样的:
> (defmacro ? (args &body body) `(lambda ,args ,@body))
Run Code Online (Sandbox Code Playgroud)
它本身似乎正确扩展:
> (macroexpand-1 '(? (x) (* x x)))
(LAMBDA (X) (* X X))
Run Code Online (Sandbox Code Playgroud)
但是当它嵌套在表达式中时,执行失败:
> ((? (x) (* x x)) 2)
(? (X) (* X X)) is not a function name; try using a symbol instead
Run Code Online (Sandbox Code Playgroud)
我可能错过了一些关于宏扩展的明显信息,但却无法弄清楚它是什么.
也许你可以帮帮我吗?
编辑:它适用于lambda:
> ((lambda (x) (* x x)) 2)
4
Run Code Online (Sandbox Code Playgroud)
编辑2:使其工作的一种方法(由Rainer建议):
> (set-macro-character #\? (lambda (stream char) (quote lambda)))
Run Code Online (Sandbox Code Playgroud)
(在Clozure CL中测试)
是否有一些实现递归神经网络的方法,如[Socher et al.2011]使用TensorFlow?请注意,这与TensorFlow很好地支持的递归神经网络不同.不同之处在于网络不会复制到线性操作序列中,而是复制到树结构中.
我想我可以使用Whileop来构造类似于数据集的每个条目的树数据结构的广度优先遍历.
也许可以在TensorFlow中实现树遍历作为新的C++ op,类似于While(但更一般)?
我正在尝试使用SFINAE专门为多种类型的结构模板.我知道类似以下的东西:
#include <iostream>
template <typename T, typename Enable = void>
struct S {
void operator()() {
std::cout << "Instantiated generic case" << std::endl;
}
};
template<typename T>
using enabled_type = typename std::enable_if<
std::is_same<T, int>::value ||
std::is_same<T, float>::value
>::type;
template <typename T>
struct S<T, enabled_type<T>> {
void operator()() {
std::cout << "Instantiated int/float case" << std::endl;
}
};
int main() {
S<float>()();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我无法修改S
要添加的结构的主模板typename Enable = void,因为它是外部标头库的一部分.所以主模板必须如下所示:
template <typename T>
struct S {
void operator()() …Run Code Online (Sandbox Code Playgroud)