小编Rog*_*son的帖子

以自定义语言实现"生成器"支持

我对语言设计有点迷茫,我现在正在玩自己的爱好语言.(http://rogeralsing.com/2010/04/14/playing-with-plastic/)

让我头脑流血的一件事是"生成器"和"yield"关键字.我知道C#使用AST转换将枚举器方法转换为状态机.

但它在其他语言中如何运作?有没有办法在没有AST转换的语言中获得生成器支持?例如,像Python或Ruby这样的语言是否采用AST转换来解决这个问题?

(问题是如何在不同语言的引擎下实现生成器,而不是如何在其中一个中编写生成器)

dsl yield generator

3
推荐指数
1
解决办法
322
查看次数

F#多态性

在记录类型方面,有没有办法处理F#中的多态?

举一个例子,假设我们有两种记录类型的地址,街道地址和方框地址.我认为,当涉及到行为时,可以在模式匹配中处理它们.但是引用怎么样,有没有办法从其他记录中引用(不是对象引用)两种类型

.net polymorphism f# records multimethod

3
推荐指数
1
解决办法
1481
查看次数

SQL Server - 将无效值转换为int

如果输入数据损坏,有没有办法处理SQL强制转换?

假设我有一个数据类型列,NVarchar(10)并希望将此列转换为int.

我们还说有些nvarchar值已损坏,因此无法转换为int.

有没有办法默默地忽略这些,默认它们为0或某些这样的?

t-sql sql-server casting

3
推荐指数
1
解决办法
2753
查看次数

自定义TaskScheduler,SynchronizationContext?

async等待演员内部的支持

我将演员lib Akka移植到.NET(https://github.com/rogeralsing/Pigeon)我想我的演员中添加async/await支持.

这给了我一些问题,因为如果我使用默认调度程序,await continuation将运行与actor并发boundarys相关.这意味着,当actor处理消息时,可以继续运行,因为这将导致两个线程同时访问actor内部状态.

如果我能以某种方式将任务安排到演员自己的邮箱,并在邮箱运行中完成任务,这将解决问题.

 public class SomeActor : UntypedActor
 {
      protected override OnReceive(object message)
      {
           if (message is SomeMessage)
           {
              DoAsyncStuff();
           }
      }

      private async void DoAsyncStuff()
      {
          var res = await something..
          //this code will not respect the actor concurrency boundary
          //since it can run at the same time as OnReceive
          Console.WriteLine(res);
      }
 }
Run Code Online (Sandbox Code Playgroud)

我确实有一个actor的线程静态上下文,所以当actor执行时,这个上下文被设置.所以我可以轻松地从任务调度程序中查找活动的actor邮箱.有点像:

public class ActorTaskScheduler : TaskScheduler
{
    protected override void QueueTask(Task task)
    {            
        var self = ActorCell.Current.Self; …
Run Code Online (Sandbox Code Playgroud)

c# concurrency multithreading task-parallel-library async-await

3
推荐指数
1
解决办法
1161
查看次数

Elixir管道无效的语法

我无法理解为什么会这样:

1..1000 |> Stream.map(&(3 * &1)) |> Enum.sum
Run Code Online (Sandbox Code Playgroud)

虽然这没有:

1..1000 |> Stream.map (&(3 * &1)) |> Enum.sum
Run Code Online (Sandbox Code Playgroud)

唯一的区别是空间经过.map 我的理解,Elixir在这种情况下不应该关心白空间.

运行上面的代码会iex产生以下错误:

warning: you are piping into a function call without parentheses, which may be ambiguous. Please wrap the function you are piping into in parentheses. For example:

foo 1 |> bar 2 |> baz 3

Should be written as:
** (FunctionClauseError) no function clause matching in Enumerable.Function.reduce/3

foo(1) |> bar(2) |> baz(3)

(elixir) lib/enum.ex:2776: Enumerable.Function.reduce(#Function<6.54118792/1 in :erl_eval.expr/5>, {:cont, …
Run Code Online (Sandbox Code Playgroud)

elixir

3
推荐指数
1
解决办法
352
查看次数

转换大型不可变消息

来自OOP背景,我在函数式编程中遇到了不可变对象/记录/消息概念的一些问题.

假设我通过一系列函数传递PurchaseOrder记录,其中每个函数应该添加或更新此记录中的数据.

在处理可变状态时,我只需设置传递消息的一些特定属性.

在处理不可变记录时,是否有一些设计技巧使事情变得更容易?复制每个字段以便只改变一个字段只是一种痛苦.

{ A = x.A ; B = x.B ; C = x.C ; D = x.D ; E = somethingnew; }
Run Code Online (Sandbox Code Playgroud)

我想尽可能地对数据进行分组是一种处理它的好方法,从而避免复制所有字段.对此还有其他方法或设计指南吗?

syntax f# functional-programming immutability

2
推荐指数
1
解决办法
136
查看次数

KnockoutJS foreach data-bind to function?

如何从KnockoutJS foreach中的函数绑定数据?

例如,我有以下代码:

 <div data-bind="foreach: timeEntries">
     <a href="#page1" data-icon="refresh" data-theme="c">
         <span data-bind="text: getActivityName(ActivityId)"></span>
     </a>
Run Code Online (Sandbox Code Playgroud)

我想调用模型上下文中存在的函数getActivityName,并传递ActivityId,它是foreach迭代的timeEntry上的属性.

只是绑定这个

data-bind="text: ActivityId"
Run Code Online (Sandbox Code Playgroud)

将正确显示每行的活动ID,但我需要进行查找并从字典中获取名称.我确实得到上面的代码最有可能调用当前项目的getactivityname而不是上下文,所以我该如何解决它?

knockout.js

2
推荐指数
1
解决办法
5107
查看次数

Disqus为所有页面加载相同的线程

在我的网站上,所有页面上都显示同一个Disqus线程.

我试过了:

  var currentPageId = '/testo';

  window.disqus_shortname = 'strengthtracker';
  window.disqus_identifier = currentPageId;
  window.disqus_url = 'http://strengthtracker.apphb.com/' + currentPageId;
Run Code Online (Sandbox Code Playgroud)

和:

  var currentPageId = '/testo';

  var disqus_shortname = 'strengthtracker';
  var disqus_identifier = currentPageId;
  var disqus_url = 'http://strengthtracker.apphb.com/' + currentPageId;
Run Code Online (Sandbox Code Playgroud)

两者结果相同,即使currentPageId发生变化,同一个线程也会出现在任何地方.

我在这做错了什么?

disqus

2
推荐指数
1
解决办法
419
查看次数

公开可取消的Task API的正确方法

如果我想公开一个API,它在内部调度一系列应由用户取消的任务.例如

public ??? DoWork()
{
    Task t = new .... , myCancellationToken);
    return ???
}
Run Code Online (Sandbox Code Playgroud)

取消控制返回的正确对象是什么?是CancellationTokenSource吗?

public CancellationTokenSource DoWork()
{
    CancellationTokenSource source = new ....
    Task t = new .... , source.Token);
    return source;
}
Run Code Online (Sandbox Code Playgroud)

我应该退还任何东西吗?我应该只接受CancellationToken作为arg并让用户在需要时创建令牌源吗?

public void DoWork(CancellationToken token)
{
    Task t = new .... , token);
}
Run Code Online (Sandbox Code Playgroud)

处理这个问题最常用的方法是什么?

c# task-parallel-library async-await

2
推荐指数
1
解决办法
243
查看次数

ASP.NET Core身份验证失败

我正在尝试向我的应用程序前端VueJS后端Asp.NET core 2.1添加身份验证,但最终却无法使它真正进行身份验证。

在Asp.NET中设置身份验证:

        var key = Encoding.ASCII.GetBytes("mysecret");
        services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
            {
                x.Events = new JwtBearerEvents
                {
                    OnTokenValidated = context =>
                    {
                        var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>();
                        var userId = int.Parse(context.Principal.Identity.Name);
                        var user = userService.GetById(userId);
                        if (user == null)
                        {
                            // return unauthorized if user no longer exists
                            context.Fail("Unauthorized");
                        }
                        return Task.CompletedTask;
                    }
                };
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key), …
Run Code Online (Sandbox Code Playgroud)

asp.net authentication

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