我Vector在Haskell 写了一个数学模块.
所以我开始:
data Vector a = Vector !a !a !a deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)
很好 - 这让我可以使用我想要的任何数值数据类型.问题是,我不希望被编写Double并Vector Double针对我不应该,原因很简单无处不在.所以我补充说:
type Scalar = Double
type Vector = Vector Scalar
Run Code Online (Sandbox Code Playgroud)
但当然第二行是错误的,因为现在有两个声明Vector.那么我该怎么改呢?我想,不,我将在我的代码中写这个,所以我想把类型别名简单地留下来Vector.这意味着我必须更改数据类型名称.但是,如果我改变了,那么我觉得我也应该改变构造函数,这会使一切更加混乱.但是如果让构造函数与类型别名具有相同的名称感觉很尴尬.
现在我有这个:
type Scalar = Double
type Vector = VectorT Scalar
data VectorT a = Vector !a !a !a deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)
我T随意挑选(我猜它代表"类型")但我不太确定这一点.通常,当我记录函数时,我会说-- Calculate the magnitude of a Vector,但VectorT我觉得我应该真的使用该类型名称.所以我只是将它们称为vectors(不是大写) - 除了我觉得我必须将此约定应用于每种数据类型的每个注释.
有没有人处于类似的情况?在这种情况下,谁能想到更优雅的解决方案?
haskell types naming-conventions algebraic-data-types type-alias
我理解在x86_64汇编中有例如(64位)rax寄存器,但它也可以作为32位寄存器,eax,16位,ax和8位来访问.在什么情况下我不会只使用完整的64位,以及为什么会有什么优势?
举个例子,通过这个简单的hello world程序:
section .data
msg: db "Hello World!", 0x0a, 0x00
len: equ $-msg
section .text
global start
start:
mov rax, 0x2000004 ; System call write = 4
mov rdi, 1 ; Write to standard out = 1
mov rsi, msg ; The address of hello_world string
mov rdx, len ; The size to write
syscall ; Invoke the kernel
mov rax, 0x2000001 ; System call number for exit = 1
mov rdi, 0 ; Exit success = 0
syscall …Run Code Online (Sandbox Code Playgroud) 现代优化编译器如何确定何时应用某些优化,例如循环展开和代码内联?
由于这两者都会影响缓存,使用少于X行的天真内联函数或任何其他简单的启发式,可能会产生性能更差的代码.那么,现代编译器如何处理这个呢?
我很难找到相关的信息(特别是那些相当容易理解的信息......),关于我能找到的最好的是维基百科文章.任何细节,书籍/文章/论文链接,非常感谢!
编辑:由于答案主要是关于我提到的两个优化(内联和循环展开),我只是想澄清我对所有和任何编译器优化感兴趣,而不仅仅是那两个.我也对可以在提前编译期间执行的优化更感兴趣,尽管JIT优化也是有意义的(尽管程度稍低).
谢谢!
compiler-construction optimization gcc compiler-optimization
当我正常加载图像中的纹理时,由于OpenGL的坐标系统,它们是颠倒的.翻转它们的最佳方法是什么?
这是我在Utilities.m文件(Objective-C)中用来加载png纹理的方法:
+ (TextureImageRef)loadPngTexture:(NSString *)name {
CFURLRef textureURL = CFBundleCopyResourceURL(
CFBundleGetMainBundle(),
(CFStringRef)name,
CFSTR("png"),
CFSTR("Textures"));
NSAssert(textureURL, @"Texture name invalid");
CGImageSourceRef imageSource = CGImageSourceCreateWithURL(textureURL, NULL);
NSAssert(imageSource, @"Invalid Image Path.");
NSAssert((CGImageSourceGetCount(imageSource) > 0), @"No Image in Image Source.");
CFRelease(textureURL);
CGImageRef image = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL);
NSAssert(image, @"Image not created.");
CFRelease(imageSource);
GLuint width = CGImageGetWidth(image);
GLuint height = CGImageGetHeight(image);
void *data = malloc(width * height * 4);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSAssert(colorSpace, @"Colorspace not created.");
CGContextRef context = CGBitmapContextCreate(
data, …Run Code Online (Sandbox Code Playgroud) 我可以[NSEvent mouseLocation]用来获取光标的位置,但这给了我屏幕坐标.如何获取光标相对于视图的坐标(当它在其中时)?我搜索了Apple文档但找不到答案.
如果它有所不同,我会希望不断检索鼠标位置,因为它将在每次帧更新中使用.
我正在编写的小C库中有一个错误报告功能.我想提供errorf除普通error函数之外的函数,以便轻松地在错误消息中嵌入信息.
/*
* Prints a formatted error message. Use it as you would use 'printf'. See the
* 'sio_error' function.
*/
void sio_errorf(const char *format, ...) {
// Print the error prefix
if (g_input == STDIN) fputs("error: ", stderr);
else fprintf(stderr, "%s: ", g_progname);
// Pass on the varargs on to 'vfprintf'.
va_list arglist;
va_start(arglist, format);
// This may produce the following warning -- ignore it:
// warning: format string is not a string literal
vfprintf(stderr, …Run Code Online (Sandbox Code Playgroud) 我无法解决这些问题.首先,在2D游戏中,投影矩阵应设置为正交,左,右,上,下与窗口匹配,对吗?但是当窗口调整大小时,我应该只更改glViewport,而不是投影矩阵吗?我如何保持纵横比?
有人可以解释这两件事的目的,在二维正字游戏中,这样我可以更好地理解它吗?
感觉就像OpenGL在2D设置中做了很多无用的东西.当图像已经存在时,栅格化和计算片段,将顶点坐标转换为NDC仅转换回glViewport已经存在的位置.
另外,传统的免费OpenGL如何制作我们自己的矩阵,而不是我们自己的glViewport计算呢?
谢谢.
我正在我的Mac上编写Haskell程序(命令行可执行文件,而不是应用程序).我正在使用GitHub来托管git存储库和主页.我所做的<project>.cabal和Setup.hs文件,因为惊天动地可以很容易地构建,测试和生成文档.我也可能上传到Hackage,我不知道.
当我标记版本1.0时,我想制作一个Homebrew公式,从GitHub下载tarball并构建它.我希望唯一的依赖是GHC.
我将使用runhaskell Setup configure/ build/ install(前缀为/ usr/local/Cellar/...)而不是cabal命令来避免依赖cabal-install.
在我开始使用Hackage的软件包之前,这一切都很好,例如blaze-builder和aeson.我应该怎么做呢?
我不想强迫非Haskellers必须下载整个Haskell平台.理想情况下,人们应该能够让Homebrew在构建我的程序之前安装GHC,然后如果他们这样选择,请在之后删除GHC.如果我使Haskell平台成为依赖项并首先通过cabal-install或类似方法安装我的Haskell依赖项,
~/.cabal/带有包的文件夹将被遗忘,即使之后也是如此brew uninstall haskell-platformcabal install去做,即将大部分范围限制在Haskellers.我认为Cabal(-install)+ Hackage是开发和Haskellers的有用工具,但不适用于此.
我应该只下载我正在使用的软件包的源代码并将其包含在我的源代码树中,并将其添加到构建命令中吗?或者我应该使用--package-db选项(在这里找到)?或者我的公式可以动态下载包的tar包并构建它吗?
我看了一下cabal2arch(Arch wiki,GitHub repo),但我不确定它是如何处理依赖关系的,或者它是否正在做我不想做的事情.
使用环境变量(如PATH)作为$ PATH或$ {PATH}有什么区别?
通常__init__方法似乎与此类似:
def __init__(self, ivar1, ivar2, ivar3):
self.ivar1 = ivar1
self.ivar2 = ivar2
self.ivar3 = ivar3
Run Code Online (Sandbox Code Playgroud)
有没有办法将参数转换为一个列表(不使用*args或**kwargs),然后使用setattr设置实例变量,参数名称和参数传递?也许可以对列表进行切片,例如,您需要至少将其切片,[1:]因为您不需要self.self.
(实际上我想它需要是一个字典来保存名称和值)
像这样:
def __init__(self, ivar1, ivar2, ivar3, optional=False):
for k, v in makedict(self.__class__.__init__.__args__): # made up __args__
setattr(self, k, v)
Run Code Online (Sandbox Code Playgroud)
谢谢!
回应未知的答案,我发现这个工作:
Class A(object):
def __init__(self, length, width, x):
self.__dict__.update(dict([(k, v) for k, v in locals().iteritems() if k != 'self']))
Run Code Online (Sandbox Code Playgroud)
要么
Class A(object):
def __init__(self, length, width, x):
self.__dict__.update(locals())
del self.__dict__['self']
Run Code Online (Sandbox Code Playgroud)
还不错..