我一直试图找出允许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放在无状态/不可变模型上时,这会导致以下三个一般性问题:
如果GUI必然允许您更改内容,那么下面的模型如何才能真正不变?我正在考虑某种设计工具,编辑器等,其中用户明确地改变了一些东西.例如,LightTable是一个编辑器,但故事是它基于不可变数据.怎么会这样?我对此次讨论并不感兴趣.
假设在某种程度上存在至少一个Atom或其他Clojure可变类型(ref/var/agent/etc)(无论是Atom包含整个内存设计数据库的单个,还是设计数据库是否是可变的不可变列表Atoms) ,哪种[MVP,MCP,MVVM等]模型最适合这种类型的创作?
JavaFX已经使用Observable接口(http://docs.oracle.com/javafx/2/api/javafx/beans/Observable.html)的 每个可以想象的变体散布了类层次结构Observable[whatever]Value,其中包括例如ObservableMap和ObservableMapValue,以及然后几十个实施课程,如... IntegerProperty和SimpleIntegerPropertygeez!WTF?假设我必须创建一些Clojure对象(defrecord等等)并Observable在我的大多数不可变对象上实现一些接口方法,我可以坚持Observable,或者我必须将每一个实现到叶节点,即ObservableIntegerValue等等?
什么是正确的高级方法?维护一个顶级原子,每次用户更改值时都会替换它?保持一千个低级原子?让我的值存在于JavaFX Observables中,忘记Clojure数据结构?使用一些reify/proxy/gen-class在Clojure中实现我自己的一组Observable,但是将它们实现为每次更改时都被替换的不可变项?Clojure的add-watch功能是否需要或存在?我非常希望我的数据只是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它们似乎很简单,我也无法运行它们.
我正在尝试为原理图,布局,绘图材料设计桌面UI.只是寻找实际软件设计师的高级建议.
假设一个内存中的"数据库",(所有用户数据的任意深度的clojure映射,以及可能的另一个用于应用程序首选项的等等),我正在研究如何在这些上执行模型 - 视图 - 控制器的事情,其中数据可以通过以下任何一个或多个来呈现和修改:
修改其中任何一个应立即显示在每个其他活动视图中,包括文本和图形,而不是在单击"确定"后...因此不允许使用模式框.如果出于某种原因,表视图,检查器视图和图形渲染都在视图中,以图形方式拖动框的角应立即显示在文本中等.
有问题的平台是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数据,而不受平台的影响.
问题是如何设置这一切,最接近不可变模型.我看到几个选项:
(deref...)垃圾.我相信这就是JFX想要这样做的方式,在叶子节点等处有巨大的Properties数组,感觉很臃肿.使用这种方法,它似乎没有比用Java/C++编写代码好多少.我还需要能够多次实例化一个数据模板.因此,例如,如果用户更改在多个位置使用的符号或形状,则将在任何地方应用单个编辑.我相信这也需要某种类型的"指针"式行为.我想我可以将一个原子存储到模型中,然后根据需要进行实例化,并且它可以在任何上述粒度模型中工作.
还有其他方法吗?试图用函数式语言做一个类似GUI编辑器的工具只是愚蠢吗?谢谢
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会话中更改当前包?如果我想与包内容进行交互,我必须手动更改它.
我正在尝试使用协议来创建工程数字类型("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数字有什么协议可以满足?我想我需要为此扩展一些现有的协议/接口.
谢谢
我有一些array-map我正在考虑的assoc价值观.在一定大小之后,返回的值是a PersistentHashMap而不是原始值PersistentArrayMap.我在几个网站上看到过这种行为.有没有办法强制插入订单甚至之后assoc?
我有一个单独的函数,它将获取一个ash-map和一个键向量,并array-map按此顺序返回一个"新鲜" 键,但这意味着对于每个assoc,我必须首先提取键,cons/conj新键到向量,然后创建一个新的数组映射.看似kludgey,即使写在一个单独的功能.
是否有一种更直接的语言支持方式来保持即使在大型(> 10,但<50)键阵列映射上的插入顺序?
如果它是相关的,我使用数组映射列表作为数据到一个incanter数据集,然后输出到excel.save-xls函数保持键/列的顺序.
谢谢
许多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
我正在尝试使用本机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"应用程序框架",例如http://pivot.apache.org/demos/ 中列出的那些,几乎都使用Swing作为GUI工具包,或者在Eclipse的情况下使用SWT.
但是我没有看到任何明显的JavaFX框架.为什么是这样?
如果看看框架调用你的"好莱坞原则",我会认为JavaFX已经这样做了,但后来我很困惑,因为看起来Swing和JavaFX的作用大致相同,就像GUI层一样.但它们都执行事件循环和回调/事件/观察者模式等.
仅仅实现一个事件循环并调用您的事件处理程序不符合"应用程序框架"的条件吗?
如果没有,是否有任何基于JavaFX的框架(而不是在Swing控件中嵌入JavaFX)?这样的框架会为JavaFX独立提供什么?
对于这个问题的"显而易见性"感到抱歉,但这对我来说并不明显.
谢谢.
我有这样的功能:
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语法".
有没有办法做到这一点?
实际上,参数是具有完整路径的长文件名,并且将它们向上移动并且使得代码实际上不可读.
clojure ×7
java ×3
javafx ×3
array-map ×1
cad ×1
ccl ×1
classpath ×1
common-lisp ×1
emacs ×1
eval-when ×1
frameworks ×1
hashmap ×1
javafx-2 ×1
lighttable ×1
matlab ×1
model ×1
namespaces ×1
pprint ×1
protocols ×1
slime ×1