小编tts*_*ras的帖子

为什么find闭包的参数需要两个&符号?

通过将我的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)

reference rust

11
推荐指数
1
解决办法
1360
查看次数

演员中的中间指针必须是"const限定" - 为什么?

在以下代码中......

#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)

c gcc const volatile

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

Lisp:宏可以递归吗?

我最近开始使用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)

lisp macros common-lisp

8
推荐指数
3
解决办法
3105
查看次数

使用enable_if可选择添加结构成员

鉴于此模板:

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)是一个优点.

c++ metaprogramming enable-if

8
推荐指数
2
解决办法
1682
查看次数

打字稿编译速度 - 尝试解决方法但坚持合并

我在过去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)

typescript

8
推荐指数
1
解决办法
5217
查看次数

PostgreSQL与Oracle:PL/pgSQL的"编译时"检查

执行摘要: 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中以其他方式自动化.

oracle postgresql plsql plpgsql

7
推荐指数
2
解决办法
2177
查看次数

正则表达式 - C#的行为与Perl/Python不同

在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)

c# regex

6
推荐指数
1
解决办法
1523
查看次数

Scala - 基于控制台的开发工作流程

在过去的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,所以当我改变我的消息来源的东西,它会自动建立
  • VIM会自动收到错误并显示错误.
  • 编译为绿色时,在sbt终端中按ENTER键,键入run
  • 等等

Ensime甚至更好,也允许自动完成:

  • sbt gen-ensime
  • 产生emacs编辑我的.scala文件之一,和 M-x ensime
  • 使用ensime-typecheck-all(映射到我的dotfiles中的F7),当一切正常时......
  • ensime-sbt-do-run

这是希望我并不孤单 - 那里的人也将帮助我进行独立调试......在我完全接受Scala之前的最后一个挑战:-)

scala

6
推荐指数
1
解决办法
572
查看次数

Python和F#中的递归变量定义(也可能是OCaml)

鉴于这些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)

python f# ocaml recursive-datastructures

5
推荐指数
1
解决办法
1236
查看次数

Emacs组织模式,导出为HTML:CLOSED时间戳?

将像这样的组织模式内容导出为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输出中?

emacs org-mode

5
推荐指数
1
解决办法
286
查看次数