我已经在一个(差不多完成的)Javascript项目上工作了14个多月了.该项目最初是我希望在一夜之间完成的黑客攻击,但随着时间的推移,Javascript部分已经成长为68个独立文件和10,314个非空行,遗憾的是目前依赖于C预处理器进行构建.
很难解释我最终是如何使用cpp来实现Javascript的:这只是一个黑客,我需要的东西能给我宏扩展,ifdef,define,并且不需要太多努力.经过大约3秒钟的考虑,我意识到cpp对于任务是"完美的":
像所有真正的黑客,这个破解是现在这么硬编码到,我真的恨也别想将需要更换的工作项目.我的项目是达到我想要的代码库迁移到自己的专用测试服务器(而不是我的笔记本电脑),但是在建立一个Linux实例,我发现舞台是GNU CPP版本4.1不再预处理后的Javascript与崩溃一起出错.
我认为现在是真正解决这个问题的好时机,而不是将特定版本的GCC添加到构建要求列表中.但问题是,我找不到具有与cpp相同功能和特性的替换预处理器!我考虑过m4,但是m4本身就是一个痛苦的世界.我发现的其他特定于Javascript的预处理器缺少我目前所依赖的所有功能,例如:
__FILE__ & __LINE__我正在认真考虑为Javascript实现一个全新的预处理器,它完全借用了C预处理器语法,因为它运行得很好.我只是想知道在这之前是否有更好的选择.:)也许已经有一个类似cpp的通用预处理器我可以交换?替换这68个文件中的所有预处理器语法所需的工作接近简单地重新实现预处理器所需的工作量.
到目前为止,依靠C预处理器,我感到非常惊讶; 在这项任务中,它比健康的心灵理解更有效.另一个对我开放的选择是为Linux,Darwin-i386,Win32静态构建cpp-4.1版本,并将这些二进制文件存储在项目的存储库中.
救命!
我正在看Apple的Lister(Apple Watch,iOS和OS X)样本.该示例对iOS和OS X执行测试:
#import <TargetConditionals.h>
#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)
@import ListerKit;
#elif TARGET_OS_MAC
@import ListerKitOSX;
#endif
Run Code Online (Sandbox Code Playgroud)
但是,没有测试TARGET_OS_WATCH或类似.Grepping for watchin TargetConditionals.h不会发出命中:
$ cat /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
/SDKs/iPhoneOS7.1.sdk/usr/include/TargetConditionals.h | grep -i watch
$
Run Code Online (Sandbox Code Playgroud)
从TargetConditionals.h,我知道有:
These conditionals specify in which Operating System the generated code will
run. The MAC/WIN32/UNIX conditionals are mutually exclusive. The EMBEDDED/IPHONE
conditionals are variants of TARGET_OS_MAC.
TARGET_OS_MAC - Generate code will run under Mac OS
TARGET_OS_WIN32 - Generate code will run under … 我已经是Java和VB.Net程序员已经有4年了,还有一个C#程序员已经有6个月了.我还使用了一堆动态语言,如Perl,Python,PHP和JavaScript.
我从来不需要预处理器.
我的问题是:为什么你会在C,C++和Objective-C中看到如此广泛使用预处理器,但很少(或从不)在Java,C#或Scala等语言中看到它?
有没有办法在devenv命令行中添加额外的预处理器#define?
是否可以在包含多行字符串文字的Haskell代码上使用CPP扩展?Haskell还有其他条件编译技术吗?
例如,我们来看看这段代码:
-- If the next line is uncommented, the program does not compile.
-- {-# LANGUAGE CPP #-}
msg = "Hello\
\ Wor\
\ld!"
main = putStrLn msg
Run Code Online (Sandbox Code Playgroud)
如果我取消注释{-# LANGUAGE CPP #-},那么GHC会用一个词法错误来反驳这段代码:
[1 of 1] Compiling Main ( cpp-multiline.hs, cpp-multiline.o )
cpp-multiline.hs:4:17:
lexical error in string/character literal at character 'o'
Run Code Online (Sandbox Code Playgroud)
使用GHC 6.12.1,可以使用cpphs.
我确认使用cpphs.compat包装器和-pgmP cpphs.compat选项有帮助,但我希望有一个不依赖于自定义shell脚本的解决方案.-pgmP cpphs不起作用.
PS我需要为GHC <6.12和GHC> = 6.12使用不同的代码,是否可以不使用预处理器?
UPD.除了接受Ganesh的答案之外,我还发现另一个解决方法是将所有条件声明放在一个单独的模块中{-# LANGUAGE CPP #-},从而避免使用多行字符串的模块中的CPP.
我的代码中有一些部分(例如在AppDelegate.m中)不应该为单元测试编译,比如
#ifndef CONFIGURATION_TESTS
// Code that should not be compiled in the Unit Tests
#endif
Run Code Online (Sandbox Code Playgroud)
在创建新项目时选择"添加单元测试"时,Xcode会设置目标.在项目文件中,我已将标志CONFIGURATION_TESTS添加到MyAppTests Built-Target的预处理器宏中,但未添加到MyApp目标.
这是我发现的许多帖子中的建议方式.
但这不起作用,因为(我猜)MyAppTests目标将MyApp目标作为依赖项,并且因为AppDelegate.m被添加到MyApp目标,它将使用MyApp构建设置进行编译,因此,未定义CONFIGURATION_TESTS .
在单元测试文件中,宏被定义并按预期运行(因为测试文件只由MyAppTests目标构建?)
有谁知道这是怎么做的,我认为这将是一个常见的问题......
如何将预处理器传递给TfidfVectorizer?我创建了一个函数,它接受一个字符串并返回一个预处理的字符串,然后我将处理器参数设置为该函数"preprocessor = preprocess",但它不起作用.我搜索了很多次,但我没有找到任何例子,好像没有人使用它.
我有另一个问题.它(预处理器参数)是否覆盖了删除停用词以及可以使用stop_words和小写参数完成的低级情况?
我试图根据代码是通过USB/Xcode(调试)运行,还是从app store(发布版)下载的生产模式启用/禁用部分代码.我知道检查它是否正在运行DEBUG或RELEASE模式如下:

#ifdef DEBUG
// Stuff for debug mode
#else
// Stuff for release mode
#endif
Run Code Online (Sandbox Code Playgroud)
但问题是,我看到一个明显的循环漏洞,你可以将'Run'构建方案的Build Configuration从'Debug'更改为'Release'.更好的方法是,如果我可以简单地检测它是否从Xcode运行.我还没有办法检查这个.
有没有办法检查iOS应用程序是否从Xcode运行?
我试图实现类似于C#预处理器的东西.我知道Java没有相同的预处理器功能,并且我知道有很多方法可以使用Factory等设计模式来实现类似的结果.但是,我仍然有兴趣找到这个问题的解决方案.
目前,我所做的是创建一个包含几个静态最终布尔属性的类,例如以下示例:
public class Preprocessor
{
public static final boolean FULLACCESS = false;
}
Run Code Online (Sandbox Code Playgroud)
然后我以下列方式使用它:
public ClassName getClassName()
{
if(Preprocessor.FULLACCESS)
{
return this;
}
else
{
return this.DeepCopy();
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这很好,这解决了我的问题(上面的例子是微不足道的,但我确实在其他有用的情况下使用它).我的问题是,是否有办法将条件置于整个方法周围,以便在给定正确的"预处理器"变量的情况下方法本身不可用?例如,我希望能够使特定的构造函数仅适用于给定"完全访问"的包,如下所示:
public ClassName()
{
// do things
}
if(FULLACCESS)
{
public ClassName(ClassName thing)
{
// copy contents from thing to the object being created
}
}
Run Code Online (Sandbox Code Playgroud)
我再次意识到Java作为一种语言的局限性(或设计决策),并且我知道在大多数情况下这是不必要的.事实上,我已经考虑过简单地创建这些"额外"方法并将它们的整个代码放在条件中,同时如果条件不活动则抛出异常,但这是一个非常粗略的解决方案似乎没有用处当我向他们提供这些库时,我的程序员.
非常感谢您提前寻求帮助.
编辑:
为了补充这个问题,我试图这样做的原因是,通过使用异常作为解决方案,IDE实际上不会将方法显示为"可用".然而,再一次,它可能仅仅是我对Java的无知.
我想要这样做的原因主要是因为我可能有多个公共接口可用,例如,一个限制性,其中控制在方法中更严格,另一个允许直接改变属性.但是,我也希望能够从.class中主动删除部分代码,例如,在某些变体不可用的产品线开发方法中.
EDIT2:
此外,重要的是要注意我也将有条件地生成文档.因此,每个编译版本的软件包都有自己的文档,只包含实际可用的文档.
我已经看到了很多关于使用LSTM进行张量流时间序列的指南,但我仍然不确定当前读取和处理数据的最佳实践 - 特别是当人们应该使用tf.data.DatasetAPI时.
在我的情况下,我有一个文件data.csv与我features,并希望做以下两个任务:
计算目标 - 目标时间t是某个范围内某些列的百分比变化,即
labels[i] = features[i + h, -1] / features[i, -1] - 1
Run Code Online (Sandbox Code Playgroud)
我想h在这里成为一个参数,所以我可以尝试不同的视野.
滚动窗口 - 出于培训目的,我需要将我的功能滚动到长度为的窗口window:
train_features[i] = features[i: i + window]
Run Code Online (Sandbox Code Playgroud)我很乐意使用pandas或构建这些对象numpy,所以我不会问如何实现这一点 - 我的问题是具体应该是什么样的管道tensorflow.
编辑:我想我也想知道我列出的2个任务是否适合数据集api,或者我最好使用其他库来处理它们?
preprocessor ×10
debugging ×2
ios ×2
java ×2
xcode ×2
c ×1
c# ×1
csv ×1
devenv ×1
ghc ×1
haskell ×1
javascript ×1
macros ×1
processor ×1
python ×1
scikit-learn ×1
tensorflow ×1
unit-testing ×1
watchkit ×1
watchos-2 ×1