通过将我的Score4 AI引擎移植到它,我一直在玩Rust - 基于我在OCaml中的功能风格实现.我特别想看看Rust如何使用功能风格的代码.
最终结果:它工作正常,速度非常快 - 比OCaml快得多.它几乎触及了命令式C/C++的速度 - 这真的很酷.
但是有一件事让我很烦恼 - 为什么我在这段代码的最后一行需要两个&符?
let moves_and_scores: Vec<_> = moves_and_boards
.iter()
.map(|&(column,board)| (column, score_board(&board)))
.collect();
let target_score = if maximize_or_minimize {
ORANGE_WINS
} else {
YELLOW_WINS
};
if let Some(killer_move) = moves_and_scores.iter()
.find(|& &(_,score)| score==target_score) {
...
Run Code Online (Sandbox Code Playgroud)
我添加它们是因为编译错误"引导"了我; 但我试图理解为什么......我使用Stack Overflow中其他地方提到的技巧来"询问"编译器告诉我什么类型的东西:
let moves_and_scores: Vec<_> = moves_and_boards
.iter()
.map(|&(column,board)| (column, score_board(&board)))
.collect();
let () = moves_and_scores;
Run Code Online (Sandbox Code Playgroud)
...导致此错误:
src/main.rs:108:9: 108:11 error: mismatched types:
expected `collections::vec::Vec<(u32, i32)>`,
found `()`
(expected struct `collections::vec::Vec`,
found ()) [E0308] …Run Code Online (Sandbox Code Playgroud) 在以下代码中......
#include <stdlib.h>
#include <stdint.h>
extern void get_buffer_from_HW_driver(volatile uint32_t **p);
void getBuffer(volatile uint32_t **pp)
{
// Write an address into pp, that is obtained from a driver
// The underlying HW will be DMA-ing into this address,
// so the data pointed-to by the pointer returned by this
// call are volatile.
get_buffer_from_HW_driver(pp);
}
void work()
{
uint32_t *p = NULL;
getBuffer((volatile uint32_t **)&p);
}
Run Code Online (Sandbox Code Playgroud)
...编译器正确地检测到对p内部指向的数据的任何潜在访问work都是危险的访问.按原样,代码指示编译器安全地发出优化掉重复读访问的代码*p- 这确实是错误的.
但奇怪的是,通过编译此代码发出警告......
$ gcc -c -Wall -Wextra -Wcast-qual …Run Code Online (Sandbox Code Playgroud) 我最近开始使用Lisp进行编码,并且已经对宏印象最深刻 - 它们允许我在编译时进行复杂的循环展开,这是我不能用我所知的任何其他语言优雅地执行此操作(即代码生成,同时保持原始结构).
关于优化:我在相同的代码中添加了类型注释(很多"fixnum").一旦我添加了其中的3个或4个,我意识到我做错了 - 这就是宏的用途,不要重复自己......
; whenever we want to indicate that the result of an operation
; fits in a fixnum, we macro expand (the fixnum (...))
(defmacro fast (&rest args)
`(the fixnum ,args))
...
(cond
(...)
(t (let* ((forOrange (+ (aref counts 5)
(fast * 2 (aref counts 6))
(fast * 5 (aref counts 7))
(fast * 10 (aref counts 8))))
(forYellow (+ (aref counts 3)
(fast * 2 (aref counts 2))
(fast …Run Code Online (Sandbox Code Playgroud) 鉴于此模板:
template <class A>
struct Something {
... // members common to all template instantiations for all A types
SpecialType member; // but not this - I want this to be conditional...
}
Run Code Online (Sandbox Code Playgroud)
...我想使用"enable_if"使SpecialType成员有条件存在; 也就是说,只有在使用A = SpecialCase1或SpecialCase2类型实例化模板时.在所有其他情况下,我希望SpecialType成员丢失.
如果你想知道为什么,这是关于优化 - 即不在结构中携带无用的有效载荷.我是模板元编程的新手,但我知道我需要"enable_if"和两个"is_same" - 不确定究竟如何,但......
编辑:使用通用C++(即没有特定于Boost)是一个优点.
我在过去3个月里一直在使用Typescript来创建非常复杂的CRUD应用程序.Typescript提供的编译时安全性为我的工作提供了显着的加速 - 在编译时捕获错误是一个天赐之物,而不是看到它们在运行时表现为异常和错误行为.
但是有一个问题.
我必须处理数百个表,所以我使用的是从DB模式开始的自定义代码生成器,并自动生成大量的Typescript文件.只要模式很小,这就完美了 - 但对于包含数百个表的非常大的模式,tsc的编译时间正在成为一个问题 - 我看到一组400个文件的编译时间为15分钟...... (以及"CALL_AND_RETRY_2分配失败"的可怕编译错误 - 即内存不足问题......)
到目前为止,我一直在Makefile中使用tsc,使用"tsc --out ..."语法调用它,从我的所有.ts文件生成一个.js.因此我认为我可以通过以增量方式进行构建来解决这个问题:自己编译每个.ts(即,在时间只将一个.ts文件传递给tsc)并最终连接所有生成的.js在一个单一的.这确实有效 - 只有在正常开发期间才需要重新编译已更改的文件(并且只有初始编译通过所有这些文件,因此需要花费很多时间).
但事实证明,这也有一个问题:为了使每个.ts"独立可编译",我不得不在顶部添加所有相关的依赖项 - 也就是说,像
/// <reference path=...
Run Code Online (Sandbox Code Playgroud)
...在每个.ts文件的顶部.
事实证明,由于这些引用,生成的.js文件包含相同的部分,在其中许多部分重复...所以当我连接.js文件时,我得到相同函数的多个定义,更糟糕的是,全局范围语句(var global = new ...)重复!
因此,我需要一种方法以某种方式智能地"合并"生成的.js文件,以避免看到复制的函数定义...
有没有办法以聪明的方式进行合并,避免重复?或者可能还有其他一些加速编译的方法?
最受欢迎的任何建议...... tsc编译速度比普通编译器慢30-100倍 - 现在它确实是一个阻塞点.
更新,2天后
Basarat(见下面的答案)帮助我在我的项目中应用他的解决方案.事实证明,尽管他的解决方案与小型和平均大小的项目完美配合,但我得到了可怕的"致命错误:CALL_AND_RETRY_2分配失败 - 处理内存不足"错误 - 这与我使用"tsc时遇到的错误相同 - 出......"
最后,我的基于Makefile的解决方案是唯一有效的 - 像这样做:
%.js: %.ts
@UPTODATE=0 ; \
if [ -f "$<".md5 ] ; then \
md5sum -c "$<".md5 >/dev/null 2>&1 && { \
UPTODATE=1 ; \
} ; \
fi ; \
if [ $$UPTODATE -eq …Run Code Online (Sandbox Code Playgroud) 执行摘要: PostgreSQL很棒,但由于它推迟了许多PL/pgSQL代码检查直到运行时间,因此我们面临着许多工作中的问题.有没有办法让它在这方面更像甲骨文的PL/SQL?
例如...
尝试在任何Oracle DB中执行此操作:
create function foo return number as
begin
select a from dual;
return a;
end;
Run Code Online (Sandbox Code Playgroud)
Oracle将立即(即在编译时!)响应:
[Error] ORA-00904: invalid identifier
Run Code Online (Sandbox Code Playgroud)
现在尝试PostgreSQL中语义相同的东西:
CREATE OR REPLACE FUNCTION public.foo ()
RETURNS integer AS
$body$
BEGIN
select a;
return a;
END;
$body$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
你会看到它 - 不幸的是! - 执行正常...没有报告错误.
但是,当您尝试调用此函数(即在运行时)时,您将获得:
ERROR: column "a" does not exist
LINE 1: select a
Run Code Online (Sandbox Code Playgroud)
有没有办法强制PostgreSQL在函数定义时执行语法分析和检查 - 而不是在运行时?我们有很多传统的PL/SQL代码在工作,我们正在移植到PostgreSQL - 但缺乏编译时检查是非常痛苦的,迫使我们做手工工作 - 即编写代码来测试所有函数中的所有代码路径/程序 - 在Oracle中以其他方式自动化.
在Python下:
ttsiod@elrond:~$ python
>>> import re
>>> a='This is a test'
>>> re.sub(r'(.*)', 'George', a)
'George'
Run Code Online (Sandbox Code Playgroud)
在Perl下:
ttsiod@elrond:~$ perl
$a="This is a test";
$a=~s/(.*)/George/;
print $a;
(Ctrl-D)
George
Run Code Online (Sandbox Code Playgroud)
在C#下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Text.RegularExpressions;
namespace IsThisACsharpBug
{
class Program
{
static void Main(string[] args)
{
var matchPattern = "(.*)";
var replacePattern = "George";
var newValue = Regex.Replace("This is nice", matchPattern, replacePattern);
Console.WriteLine(newValue);
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,C#打印:
$ csc regexp.cs
Microsoft (R) Visual C# 2008 Compiler …Run Code Online (Sandbox Code Playgroud) 在过去的10天里,我一直在阅读"Scala编程"并编写一些Scala代码.
正如您在我的GitHub Scala游乐场中所看到的,我开始非常喜欢这种语言 - 它与OCaml一样快(感谢JVM的HotSpot技术),通过其强大的静态类型系统保护我免受错误(以及错误!) ,最重要的是:在企业方面,它并不存在于一个偏远的"孤岛"(如Haskell和OCaml)......因为它拥有巨大的JVM生态系统.
到目前为止我唯一的问题:
即使我已经想出如何使用sbt-quickfix在VIM下开发我的Scala代码,或者在使用Ensime的Emacs下进行开发(因此具有自动完成和错误导航),我到目前为止还没有找到一种方法来调试我的代码,和Python一样容易:
bash$ python -m pdb ./someCode.py
Run Code Online (Sandbox Code Playgroud)
Google指出的所有条目基本上都在说:"使用我真正喜欢的IDE ......"
然而,有一些理由 - 没有必要列举它们,你要么知道它们要么你不知道 - 像我这样的人更喜欢(a)可编程编辑器和(b)独立的调试器,可以在编辑器之外使用.
如果你是少数志同道合的人之一,不喜欢IDE并且碰巧使用Scala,我真的很想知道你如何调试 - 实际上我有兴趣听听你的整个工作流程.
我的到目前为止是:
sbt-quickfix到我的SBT的项目/文件夹(只需看看我在这个GitHub回购中的代码)sbt在一个终端,并运行~compile,所以当我改变我的消息来源的东西,它会自动建立sbt终端中按ENTER键,键入runEnsime甚至更好,也允许自动完成:
sbt gen-ensimeM-x ensimeensime-typecheck-all(映射到我的dotfiles中的F7),当一切正常时......ensime-sbt-do-run这是希望我并不孤单 - 那里的人也将帮助我进行独立调试......在我完全接受Scala之前的最后一个挑战:-)
鉴于这些F#类型声明......
type Message =
| MessageA
| MessageB
| MessageC
| MessageD
type State = {
Name:string
NextStateMap: Map<Message,State>
}
Run Code Online (Sandbox Code Playgroud)
...对这个特定的状态机有一个同样富有表现力的定义......
let rec state0 = { Name = "0"; NextStateMap = Map.ofList [ (MessageA,state1); (MessageB,state2)] }
and state1 = { Name = "1"; NextStateMap = Map.ofList [ (MessageB,state3)] }
and state2 = { Name = "2"; NextStateMap = Map.ofList [ (MessageA,state3)] }
and state3 = { Name = "3"; NextStateMap = Map.ofList [ (MessageC,state4)] }
and state4 = { Name …Run Code Online (Sandbox Code Playgroud) 将像这样的组织模式内容导出为HTML(即Cc Ce hh)...
* Some project
** DONE Some final work
CLOSED: [2016-03-30 Wed]
Received final report blah blah...
** DONE Final tests
CLOSED: [2016-03-28 Mon]
...
Run Code Online (Sandbox Code Playgroud)
... CLOSED时间戳未显示在HTML输出中.要查看我是否可以看到导出的时间戳,我手动去了并将DONE条目更改为:
* Some project
** DONE Some final work [2016-03-30 Wed]
CLOSED: [2016-03-30 Wed]
Received final report blah blah...
Run Code Online (Sandbox Code Playgroud)
...然后时间戳确实显示在HTML TOC输出中(浅灰色).
即使我可以使用我的编辑foo自动执行此操作,但我不愿意,如果我可以避免它.有没有办法强制CLOSED时间戳显示在组织模式导出的HTML输出中?