小编Son*_*oth的帖子

JavaFX和Clojure:将observable绑定到不可变对象

我一直试图找出允许JavaFX TableView(或任何其他JavaFX事物)表示一些Clojure数据的方法,并允许用户通过GUI操作数据.

对于这个讨论,让我们假设我有一个列表/矢量的地图,即类似的东西 [{:col1 "happy1" :col2 "sad1"} {:col1 "happy2" :col2 "sad2"}],我希望它显示在图形表中,如下所示:

mykey1      mykey2
------------------
happy1      sad1
happy2      sad2
Run Code Online (Sandbox Code Playgroud)

非常直截了当.这在世界历史上已经完成了无数次.

问题是TableView坚持采用ObservableList等,这本身就是一个可变的东西,就像JavaFX中的所有Observable一样.这非常适合保持表格更新,并且在可变模型中,它也非常适合允许用户通过GUI直接操作数据.我不是专家,但在这种情况下,似乎JavaFX希望GUI对象实际包含真实数据.这对我来说似乎很有趣(不是哈哈).通过某些API或接口维护我自己的模型并在GUI和模型之间进行通信也意味着我将数据保存在两个地方:在我自己的模型中,在GUI中.这是正确的做事方式吗?也许这是可以的,因为GUI只显示总数据的一小部分,并且它允许我的模型数据只是普通模型数据,而不是某些Java派生类型的实例.

因此,当尝试将GUI放在无状态/不可变模型上时,这会导致以下三个一般性问题:

  1. 如果GUI必然允许您更改内容,那么下面的模型如何才能真正不变?我正在考虑某种设计工具,编辑器等,其中用户明确地改变了一些东西.例如,LightTable是一个编辑器,但故事是它基于不可变数据.怎么会这样?我对此次讨论并不感兴趣.

  2. 假设在某种程度上存在至少一个Atom或其他Clojure可变类型(ref/var/agent/etc)(无论是Atom包含整个内存设计数据库的单个,还是设计数据库是否是可变的不可变列表Atoms) ,哪种[MVP,MCP,MVVM等]模型最适合这种类型的创作?

  3. JavaFX已经使用Observable接口(http://docs.oracle.com/javafx/2/api/javafx/beans/Observable.html)的 每个可以想象的变体散布了类层次结构Observable[whatever]Value,其中包括例如ObservableMapObservableMapValue,以及然后几十个实施课程,如... IntegerPropertySimpleIntegerPropertygeez!WTF?假设我必须创建一些Clojure对象(defrecord等等)并Observable在我的大多数不可变对象上实现一些接口方法,我可以坚持Observable,或者我必须将每一个实现到叶节点,即ObservableIntegerValue等等?

什么是正确的高级方法?维护一个顶级原子,每次用户更改值时都会替换它?保持一千个低级原子?让我的值存在于JavaFX Observables中,忘记Clojure数据结构?使用一些reify/proxy/gen-class在Clojure中实现我自己的一组Observable,但是将它们实现为每次更改时都被替换的不可变项?Clojure的add-watch功能是否需要或存在?我非常希望我的数据只是Clojure中的普通数据,而不是"类型"或任何接口的实现.整数应该是整数等.

谢谢

javafx clojure lighttable

23
推荐指数
1
解决办法
945
查看次数

无法让pprint在clojure中工作

Noob问题,使用Win7 64位,Clojure 1.2.0,Java 1.6.0_22

当我从命令行启动clojure时,pprint函数很容易获得.

user=> pprint
#<pprint$pprint clojure.pprint$pprint@16dfa45>
user=> (pprint "hi")
"hi"
nil
user=>
Run Code Online (Sandbox Code Playgroud)

但是当我尝试从文件中使用pprint时,我收到错误.无论是否使用命名空间(ns ...:require ...)都会发生这种情况,如pprint文档中所示

clj文件如下:

(ns whatevah
(:require clojure.pprint))

(pprint "hi")
Run Code Online (Sandbox Code Playgroud)

错误如下:

C:\Users\mischw\code\Clojure>java -cp ";c:\users\mischw\code\clojure\classes\*;c:\Program Files (x86)\Java\SWT;c:\users\mischw\code\clojure\classes\bookcode\*" clojure.main swinglearn.clj 
Exception in thread "main" java.lang.Exception: Unable to resolve symbol: pprint in this context (swinglearn.clj:14)
... 21 more

Output completed (0 sec consumed) - Normal Termination
Run Code Online (Sandbox Code Playgroud)

我不明白这里发生了什么的一般想法.为什么一个工作而另一个工作?这与名称空间有关吗?类路径?其他一些简单的修复?显然noob问题,但我发现这发生在一堆例子中......即使导入/使用/ require/include它们似乎很简单,我也无法运行它们.

namespaces clojure classpath pprint

17
推荐指数
1
解决办法
7263
查看次数

Clojure:如何构建桌面UI

我正在尝试为原理图,布局,绘图材料设计桌面UI.只是寻找实际软件设计师的高级建议.

假设一个内存中的"数据库",(所有用户数据的任意深度的clojure映射,以及可能的另一个用于应用程序首选项的等等),我正在研究如何在这些上执行模型 - 视图 - 控制器的事情,其中数据可以通过以下任何一个或多个来呈现和修改:

  1. 一个独立的文本字段,显示单个参数,例如框宽.
  2. "检查器"类型的视图,显示所选对象的多个参数,例如框宽,高度,颜色,复选框等.
  3. 表/电子表格类型的视图,显示多个对象的多个参数,可能是整个数据库
  4. 整个事物的图形渲染,例如原理图和布局视图.

修改其中任何一个应立即显示在每个其他活动视图中,包括文本和图形,而不是在单击"确定"后...因此不允许使用模式框.如果出于某种原因,表视图,检查器视图和图形渲染都在视图中,以图形方式拖动框的角应立即显示在文本中等.

有问题的平台是JavaFX,但我想在UI和其他所有内容之间进行清晰的分离,所以我想避免bind使用JFX,因为这会将我的设计数据与JFX Properties紧密联系起来,增加了模型的颗粒感,并迫使我在标准的clojure函数之外工作以处理数据,和/或大量处理整个getValue/ setValue世界.

我仍然假设至少有一些有状态/可变性,并使用内置的Clojure功能,例如add-watch对atom/var/ref 的能力,并让运行时信号依赖于函数.

特定于平台的交互将与实际的UI紧密相关,例如reifying ActionListeners和处理ObservableValues等,并将尝试最小化对JavaFX Property等实际应用程序数据的依赖.我不是为了这个而招待FRP.

我不介意扩展JFX接口或构建我自己的协议来使用特定于应用程序的协议defrecord,但我更喜欢将应用程序数据保留为直接的Clojure数据,而不受平台的影响.

问题是如何设置这一切,最接近不可变模型.我看到几个选项:

  1. 细粒度:每个参数值/基元(即Long,Double,Boolean或String)都是一个原子,每个视图都可以修改值"到达",只要它在数据库中需要更改值即可.这可能很糟糕,因为可能存在数千个单独的值(例如手绘曲线上的点),并且需要大量(deref...)垃圾.我相信这就是JFX想要这样做的方式,在叶子节点等处有巨大的Properties数组,感觉很臃肿.使用这种方法,它似乎没有比用Java/C++编写代码好多少.
  2. 中等粒度:数据库中的每个对象/记录都是Clojure映射的原子.当其中任何一个值发生变化时,将替换整个地图.处理的原子总数较少,并且允许例如用于各种事物的长序列数字.但是,当数据库中的某些对象需要比其他对象更多的嵌套时,这会变得复杂.
  3. 粗粒:只有一个原子:数据库.任何时候发生任何变化,都会替换整个数据库,并且每个视图都需要重新渲染其特定部分.这感觉有点像使用锤子拍打苍蝇,而天真的实施则需要一直重新渲染.但我仍然认为这是最好的权衡,因为任何原语都有一个来自根节点的清晰访问路径,无论是在每个原始级别还是每个记录级别访问.

我还需要能够多次实例化一个数据模板.因此,例如,如果用户更改在多个位置使用的符号或形状,则将在任何地方应用单个编辑.我相信这也需要某种类型的"指针"式行为.我想我可以将一个原子存储到模型中,然后根据需要进行实例化,并且它可以在任何上述粒度模型中工作.

还有其他方法吗?试图用函数式语言做一个类似GUI编辑器的工具只是愚蠢吗?谢谢

model javafx cad clojure

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

Common Lisp:如何从Emacs Slime中获取(in-package ...)

64位Windows 7
Clozure Common Lisp版本1.9 WindowsX8632
Emacs 24.3.1
史莱姆更改日期2014-06-17

我有一个示例.lisp文件,开头如下:

(ql:quickload 'qt)
(in-package "QT")
Run Code Online (Sandbox Code Playgroud)

程序的其余部分显示一个对话框.当我从命令行运行wx86cl -load helloqt.lisp它时,它似乎工作正常.当我从Emacs Slime(C-x C-k)运行它时,它说没有包"QT".但是,如果我首先单独评估第一行(C-x C-e)然后我可以编译整个事情并且它可以工作,模拟尝试在Windows上的Slime内运行QT线程的正常问题.

我如何制作它以便我可以从emacs编译/运行该文件而无需先手动评估第一行?

另外,为什么不在(in-package ...)Slime会话中更改当前包?如果我想与包内容进行交互,我必须手动更改它.

emacs common-lisp slime ccl eval-when

7
推荐指数
1
解决办法
922
查看次数

如何在Clojure中扩展数值协议

我正在尝试使用协议来创建工程数字类型("knumber"),所以我可以说(+ "1k" "2Meg")并得到类似的东西"2.001Meg".我应该能够像这样从knumber获得浮点值(:val my-knumber),但通常打印机应该显示字符串,也可以这样访问(:string my-knumber).这个数字将支持所有常用的p,n,u,m,k,Meg,G后缀,并根据需要进行转换,例如(/ "1Meg" "1G") -> "1m").我希望能够将此传递给任何需要数字的函数.

无论如何,有人可以建议一个策略吗?我想我需要使用协议.我目前有一个,(defrecord knumber [val string])但我不确定接下来会发生什么.

clojure数字有什么协议可以满足?我想我需要为此扩展一些现有的协议/接口.

谢谢

protocols clojure

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

如何获取clojure数组映射以在assoc之后维护插入顺序?

我有一些array-map我正在考虑的assoc价值观.在一定大小之后,返回的值是a PersistentHashMap而不是原始值PersistentArrayMap.我在几个网站上看到过这种行为.有没有办法强制插入订单甚至之后assoc

我有一个单独的函数,它将获取一个ash-map和一个键向量,并array-map按此顺序返回一个"新鲜" 键,但这意味着对于每个assoc,我必须首先提取键,cons/conj新键到向量,然后创建一个新的数组映射.看似kludgey,即使写在一个单独的功能.

是否有一种更直接的语言支持方式来保持即使在大型(> 10,但<50)键阵列映射上的插入顺序?

如果它是相关的,我使用数组映射列表作为数据到一个incanter数据集,然后输出到excel.save-xls函数保持键/列的顺序.

谢谢

clojure hashmap array-map

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

Clojure和JavaFX 2 - 将多个arity参数传递给JavaFX方法

许多JavaFx方法采用var args,例如Group,它在Java中声明为:

public Group(Node... children)
Run Code Online (Sandbox Code Playgroud)

其他例如:

public KeyFrame(Duration time, KeyValue... values)
Run Code Online (Sandbox Code Playgroud)

我已经发现了...我应该将java数组传递给方法的方法,所以我一直在做这样的事情,

(-> timeline .getKeyFrames 
  (.addAll 
    (into-array [(KeyFrame. blabla) (KeyFrame. blabla)]))`
Run Code Online (Sandbox Code Playgroud)

(into-array...)每次有一个var arg时都要这么做很烦人,当var arg是我实际传入的基类时,它会更烦人.例如

(Group. (into-array [(Circle. 100) (Rectangle. 100 100)]))
Run Code Online (Sandbox Code Playgroud)

导致类型不匹配错误.相反,我必须这样做:

(Group. (into-array Node [(Circle. 100) (Rectangle. 100 100)]))
Run Code Online (Sandbox Code Playgroud)

所以我做了这个功能:

(defn make-group [& items]
  (Group. (into-array Node items)))
Run Code Online (Sandbox Code Playgroud)

哪个适用于群组,但不能解决一般问题.

那么有没有一种解决省略号/变量问题的好方法,所以我不必为每个vararg方法创建特殊函数?这个函数的要求是它需要你想要调用的方法(例如Group),固定的args,var args,以及某种神奇的函数知道如何找到var args中元素的公共基类.

谢谢

java clojure variadic-functions clojure-java-interop javafx-2

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

Clojure:[D和[Ljava.lang.Double ;?]之间有什么区别?

我正在尝试使用本机Java数组做一些事情,我不明白两个双数组实例之间的区别.这与拳击和取消装箱值有关吗?在所有情况下(first...),每个数组的类型都有java.lang.Double类型.Clojure协议似乎对这种区别很敏感.

user> (class (make-array Double/TYPE 3))  ;; [D
user> (class (double-array [1 2 3]))      ;; [D
user> (class (into-array (make-array Double/TYPE 3)))  ;; [Ljava.lang.Double;
user> (class (into-array (double-array [1 2 3])))      ;; [Ljava.lang.Double;
user> (class (into-array (repeat 2 (double-array [1 2 3]) ))) ;; [[D
Run Code Online (Sandbox Code Playgroud)

java clojure

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

Java桌面应用程序框架与JavaFX

有许多Java"应用程序框架",例如http://pivot.apache.org/demos/ 中列出的那些,几乎都使用Swing作为GUI工具包,或者在Eclipse的情况下使用SWT.

但是我没有看到任何明显的JavaFX框架.为什么是这样?

如果看看框架调用你的"好莱坞原则",我会认为JavaFX已经这样做了,但后来我很困惑,因为看起来Swing和JavaFX的作用大致相同,就像GUI层一样.但它们都执行事件循环和回调/事件/观察者模式等.

仅仅实现一个事件循环并调用您的事件处理程序不符合"应用程序框架"的条件吗?

如果没有,是否有任何基于JavaFX的框架(而不是在Swing控件中嵌入JavaFX)?这样的框架会为JavaFX独立提供什么?

对于这个问题的"显而易见性"感到抱歉,但这对我来说并不明显.

谢谢.

java frameworks javafx

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

如何在续行中添加注释

我有这样的功能:

result = myfunc(arg1, ...
                arg2, ...
                arg3);
Run Code Online (Sandbox Code Playgroud)

我想评论出arg2并加入其他内容:

result = myfunc(arg1, ...
         %      arg2, ...    <-- I get a red squiggly underline at the last dot
                arg2b, ...   <-- and under arg2b
                arg3);       <-- and under the closing parenthesis
Run Code Online (Sandbox Code Playgroud)

但是matlab不会让我在续行中发表评论,并且我的所有Google搜索都会出现多行语句或多行注释,但不会出现多行语句中的注释.

错误是"解析错误:使用可能是无效的Matlab语法".

有没有办法做到这一点?

实际上,参数是具有完整路径的长文件名,并且将它们向上移动并且使得代码实际上不可读.

matlab

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